تحويل قائمة إلى قائمة ثنائية
-
06-07-2019 - |
سؤال
توصي Apple بشدة باستخدام تنسيق plist الثنائي عند قراءة مجموعات كبيرة من البيانات المستندة إلى XML في تطبيقات iPhone.من بين أسبابهم حقيقة أن تحليل XML مرهق جدًا لجهاز iPhone.ومع ذلك، يتطلب هذا تحويل الملفات الموجودة على خادم الويب البعيد أولاً.
بالنسبة للمحتوى الذي يتغير بشكل متكرر، فمن غير المقبول القيام بذلك يدويًا.إذا كان ذلك ممكنًا، أود تجنب قيام تطبيق قائم على الويب باستدعاء سطر الأوامر لإجراء التحويل (على سبيل المثال، plutil).
هل هناك خوارزميات متاحة للعامة لإجراء هذا التحويل؟
المحلول
نعم. كافة التعليمات البرمجية بليست هو جزء من CoreFoundation، وهي مفتوحة المصدر. CoreFoundation يمكن أن يبنى مباشرة وتعمل على لينكس وويندوز، حتى تتمكن من كتابة أداة CF باستخدام واجهات برمجة التطبيقات العادية التي سوف تستخدم على نظام التشغيل Mac OS X، ولكن بناء وتشغيله على منصات أخرى.
ووAPI معين تريد أن تبحث في هو <وأ href = "http://developer.apple.com/documentation/CoreFoundation/Reference/CFPropertyListRef/Reference/reference.html#//apple_ref/c/func/ CFPropertyListWriteToStream "يختلط =" noreferrer "> CFPropertyListWriteToStream () . رمز CoreFoundation متاح من أبل (<أ href ل = "http://www.opensource.apple.com/darwinsource/tarballs/apsl/CF-476.15.tar.gz" يختلط = "noreferrer"> كتل القطران )، من بين أماكن أخرى.
وأخيرا اعتمادا على كيفية غالبا ما تقوم بتحديث الملف، وكم المعالج لديك لتجنيب على الخادم، ومدى تكرار وجود البيانات الخاصة بك قد يكون هناك تعزيز كبير واحد يقم التي يمكنك القيام به. افتراضيا يتم uniqued بعض العناصر في قوائم Plists ثنائي (مثل السلاسل). عناصر أخرى ليست (مثل المصفوفات وdictionarts). يسمح الشكل PLIST ثنائي لها أن تكون uniqued، والمسألة هي أنه مكلف أن يمشي في الواقع من خلال والمصفوفات والقواميس فريدة من نوعها. إذا كان لديك الكثير من صفائف مطابقة أو dicts في المحتوى الخاص بك قد تشهد انخفاضا كبيرا الحجم عن طريق uniquing لهم. يمكنك تمكين ذلك عن طريق القرصنة تصل _flattenPlist () في CFBinaryPlist. ج .
إذا كنت تفعل ذلك للتأكد من اختبار دقيق جدا، وعدم القيام على أي الملفات التي لا يمكن تحديث عبر الشبكة، فقط في حالة إصدار مستقبلي يجعل أي تحسينات كسر ذلك. أيضا، تأكد من أنك على استعداد لإيقاف تشغيله في أي لحظات.
نصائح أخرى
وهناك PHP وروبي تنفيذ لذلك:
وتنفيذ روبي مرتبط روبي 1.9 فقط. طرقت حتى مسلسل ثنائي سريع الذي يعمل في روبي 1.8.
وليس من الواضح إذا كنت تريد أن تفعل التحويل على اي فون أو على الخادم. إذا كان على الخادم ويمكنك استخدام أطر الكاكاو، ويوفر NSPropertyListSerialization
الخدمات للتحويل بين الأنواع المعتمدة بليست (سلسلة، XML، وثنائي) على OS X (منذ 10.2). وهناك أيضا أساليب مماثلة في مكتبة مؤسسة كور إذا كنت تفضل استخدام بدلا من ذلك.
لتحويل بليست XML إلى ثنائي واحد:
NSString *xmlPlistPath; // already set
NSString *outPath; // already set
NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];
plist = [NSPropertyListSerialization propertyListFromData:plistData
mutabilityOption:NSPropertyListImmutable
format:&format
errorDescription:&error];
if(plist == nil) { // unable to parse plist
//deal with failure -- error gives description of the error
} else {
binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&error];
if(binaryPlistData == nil) {//unable to create serialized plist
// deal with failure -- error gives description of the error
}
if(![binaryPlistData writeToFile:outPath atomically:YES]) {
// unable to write file
}
}
وانظر <لأ href = "http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/Articles/SerializedPListsConcept.html#//apple_ref/doc/uid/20001016-55191" يختلط = "noreferrer" > صفحة خصائص قائمة Pramming دليل على developer.apple.com لمزيد من المعلومات.
أداة سطر الأوامر plutil - أداة مساعدة لقائمة الخصائص
تمتلك شركة Apple أداتين جيدتين جدًا لسطر الأوامر لتشويه ملفات قائمة الخصائص.
/usr/libexec/Plistbuddy
- لتحرير القوائم/usr/bin/plutil
- التحقق من بناء الجملة ونوع التحويل
من صفحة رجل بلوتيل:
يمكن استخدام Plutil للتحقق من بناء جملة ملفات قائمة الخصائص ، أو تحويل ملف PLIST من تنسيق إلى آخر.تحديد - كما يقرأ ملف الإدخال من stdin.
تحويل قائمة موجودة إلى تنسيق XML أو ثنائي أو JSON
plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
وهناك تنفيذ بيرل يسمى أيضا PLIST البيانات ::
جوهرة binary_plist لإضافة بليست كتنسيق استجابة صالحة لتحكم القضبان تبدو واعدة.
وقبل أيام سيرفيرال كنت قد وجدت بعض المشاكل في التواصل مع البيانات الثنائية بليست في دائرة الرقابة الداخلية، وهذا Gist
لي هو حل المشكلة ببساطة: <لأ href = "https://gist.github.com/ngbaanh/f9c640e64e60189c7dc5e37fbce4b4f1" يختلط = "نوفولو noreferrer"> PLIST تحويل مكتوب في سويفت