سؤال

توصي 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 وروبي تنفيذ لذلك:

http://code.google.com/p/cfpropertylist/

وتنفيذ روبي مرتبط روبي 1.9 فقط. طرقت حتى مسلسل ثنائي سريع الذي يعمل في روبي 1.8.

http://gist.github.com/303378

وليس من الواضح إذا كنت تريد أن تفعل التحويل على اي فون أو على الخادم. إذا كان على الخادم ويمكنك استخدام أطر الكاكاو، ويوفر 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 تحويل مكتوب في سويفت

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top