Conversion de plist en plist binaire
-
06-07-2019 - |
Question
Apple recommande vivement d'utiliser le format binaire plist lors de la lecture de grands ensembles de données XML dans les applications iPhone. Parmi leurs arguments, citons le fait que l'analyse XML est très éprouvante pour l'iPhone. Toutefois, cela nécessite que les fichiers résidant sur le serveur Web distant soient d'abord convertis.
Pour le contenu fréquemment modifié, il n'est pas acceptable de le faire manuellement. Dans la mesure du possible, j'aimerais éviter qu'une application Web appelle la ligne de commande pour effectuer la conversion (c'est-à-dire, plutil).
Existe-t-il des algorithmes publiquement disponibles pour effectuer cette conversion?
La solution
Oui. Tout le code de plist fait partie de CoreFoundation, qui est opensource. CoreFoundation peut être directement construit et exécuté sur Linux et Windows, vous pouvez donc écrire un outil CF à l'aide des API normales que vous utiliseriez sous Mac OS X, mais le construire et l'exécuter sur d'autres plateformes.
L'API particulière que vous souhaitez consulter est CFPropertyListWriteToStream () . Le code de CoreFoundation est disponible à partir de Apple ( tarball ), entre autres.
Enfin, en fonction de la fréquence de mise à jour du fichier, du nombre de processeurs disponibles sur le serveur et du nombre de répétitions de vos données, il vous restera peut-être une amélioration significative à apporter. Par défaut, certains éléments des plists binaires sont uniques (tels que des chaînes). Les autres éléments ne le sont pas (tels que les tableaux et les dictionnaires). Le format de plist binaire leur permet d'être uniques, le problème est qu'il est coûteux de parcourir réellement des tableaux et des dictionnaires uniques. Si vous avez beaucoup de tableaux ou de dessins identiques dans votre contenu, il est possible que vous constatiez une réduction de taille significative en les unifiant. Vous pouvez l'activer en piratant _flattenPlist () dans CFBinaryPlist. c .
Si vous le faites, assurez-vous de le tester de manière approfondie, et ne le faites pas sur les fichiers que vous ne pouvez pas mettre à jour sur le réseau, juste au cas où une version ultérieure apporte des optimisations qui ne fonctionneraient pas. Assurez-vous également que vous êtes prêt à l'éteindre à tout moment.
Autres conseils
Il existe une implémentation PHP et Ruby pour cela:
L'implémentation Ruby liée est Ruby 1.9 uniquement. J'ai créé un sérialiseur binaire rapide qui fonctionne en Ruby 1.8.
Il n'est pas clair si vous souhaitez effectuer la conversion sur l'iPhone ou sur le serveur. Si c'est sur le serveur et que vous pouvez utiliser les frameworks Cocoa, le NSPropertyListSerialization
fournit des services permettant de convertir les types de plist pris en charge (chaîne, XML et binaire) sur OS X (depuis 10.2). Il existe également des méthodes analogues dans la bibliothèque Core Foundation si vous préférez l’utiliser à la place.
Pour convertir une plist XML en une plique:
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
}
}
Voir Guide de vérification de la liste des propriétés sur developer.apple.com pour plus d'informations.
Outil de ligne de commande plutil - utilitaire de liste de propriétés
Apple dispose de deux très bons outils de ligne de commande pour modifier les fichiers de liste de propriétés.
-
/ usr / libexec / Plistbuddy
- pour les plists d'édition -
/ usr / bin / plutil
- vérification de la syntaxe et conversion de type
Extrait de la page de manuel de plutil:
plutil peut être utilisé pour vérifier la syntaxe des fichiers de liste de propriétés, ou pour convertir un fichier plist d'un format à un autre. Spécification - en tant que fichier d'entrée lit à partir de stdin.
Conversion d'un plist existant au format XML, binaire ou JSON
plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
Il existe une implémentation Perl aussi appelée Data :: Plist
La joyau binary_plist d'ajouter le plist en tant que format de réponse valide pour les contrôleurs Rails semble prometteuse.
Gist
est destiné à résoudre le problème simplement: Convertisseur Plist écrit en Swift