plistからバイナリplistへの変換
-
06-07-2019 - |
質問
アップルは、大きなXMLベースのデータセットをiPhoneアプリに読み込む場合、バイナリplist形式を使用することを強くお勧めします。その理由の1つは、XML解析がiPhoneに非常に負担がかかるという事実です。ただし、これにはリモートWebサーバーにあるファイルを最初に変換する必要があります。
頻繁に変更されるコンテンツの場合、これを手動で行うことは受け入れられません。可能な場合は、Webベースのアプリがコマンドラインを呼び出して変換を実行しないようにします(つまり、plutil)。
この変換を実行するために公開されているアルゴリズムはありますか?
解決
はい。すべてのplistコードは、オープンソースであるCoreFoundationの一部です。 CoreFoundationはLinuxおよびWindowsで直接ビルドおよび実行できるため、Mac OS Xで使用する通常のAPIを使用してCFツールを記述できますが、他のプラットフォームでビルドおよび実行できます。
見たい特定のAPIは CFPropertyListWriteToStream()。 CoreFoundationのコードは、 Apple ( tarball )など。
最後に、ファイルを更新する頻度、サーバー上で必要なプロセッサの量、およびデータの繰り返しの量に応じて、重要な拡張機能を1つ残します。デフォルトでは、バイナリリストの特定の要素は一意です(文字列など)。他の要素はそうではありません(配列や辞書など)。バイナリplist形式を使用すると、それらを一意にすることができます。問題は、実際にウォークスルーするのに費用がかかり、一意の配列と辞書が必要になることです。コンテンツに同一の配列または辞書が多数ある場合、それらを一意にすることでサイズが大幅に縮小することがあります。これを有効にするには、 CFBinaryPlistで_flattenPlist()をハックします。 c 。
これを行う場合は、将来のリリースでそれを破る最適化が行われる場合に備えて、ネットワーク上で更新できないファイルに対しては非常に徹底的にテストし、実行しないようにしてください。また、すぐに通知をオフにする準備ができていることを確認してください。
他のヒント
そのためのPHPとrubyの実装があります:
リンクされたRuby実装はRuby 1.9のみです。 Ruby 1.8で動作するクイックバイナリシリアライザーをノックアップしました。
変換をiPhoneで行うかサーバーで行うかは明確ではありません。サーバー上にあり、Cocoaフレームワークを使用できる場合、 NSPropertyListSerialization
は、OS X(10.2以降)でサポートされているplistタイプ(文字列、XML、バイナリ)間の変換サービスを提供します。代わりに使用したい場合は、Core Foundationライブラリにも同様のメソッドがあります。
XML plistをバイナリ1に変換するには:
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
}
}
詳細については、developer.apple.comのProperty List Pramming Guide ページをご覧ください。
コマンドラインツールplutil-プロパティリストユーティリティ
Appleには、プロパティリストファイルをマングリングするための2つの非常に優れたコマンドラインツールがあります。
-
/ usr / libexec / Plistbuddy
-リストの編集用 -
/ usr / bin / plutil
-構文チェックと型変換
plutilのマニュアルページから:
plutilを使用して、プロパティリストファイルの構文を確認したり、変換したりできます。 ある形式から別の形式へのplistファイル。入力ファイルとして-を指定する stdinから読み取ります。
既存のplistをXML、バイナリ、またはJSON形式に変換する
plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
Perl実装も呼ばれます Data :: Plist
binary_plist gem は、Railsコントローラーの有効な応答形式としてplistを追加することを期待しています。
数日前、私はiOSのplistバイナリデータを使用したネットワークでいくつかの問題を発見しましたが、私の Gist
は単純に問題を解決するためのものです: Swiftで記述されたPlist Converter