Librairies Plist ?
yoann
Membre
Une fois n'est pas coutume je vais un peut oublier le NDA de la WWDC pour un sujet bien précis, les échanges client/serveur pour vos applications iPhone (et Mac aussi).
Une jolie présentation nous a était faite pour présenter les différences de temps de chargement entre XML, JSON, Plist et Plist binaire sur l'iPhone.
Pour résumer, les temps de téléchargement sont quasi identique pour JSON, Plist et Plist binaire et bien plus élevé pour XML. Quant au temps de chargement des données (pour en faire un truc utilisable en code), elles sont énormes en XML bien entendu, en JSON acceptable, Plist standard plus rapide que JSON et Plist binaire carrément infime, et pour cause c'est prévu pour être utilisé par NSDictionary et NSArray directement.
Pour les formats Plist la présentation disaient d'utiliser WebObject pour les gérer aussi simplement que sur le client (ndlr. en une seule ligne de code que ce soit pour l'import ou l'export) ou de voir des lib alternative qui existe.
Ma question est donc, que connaissez vous comme lib capable de sortir du Plist sur un web service ou encore mieux, du plist binaire ? Cela pourrait être intéressant de se constituer une liste comparative de ces librairies.
Pour ma part je n'en connait pas pour le moment :-/
Une jolie présentation nous a était faite pour présenter les différences de temps de chargement entre XML, JSON, Plist et Plist binaire sur l'iPhone.
Pour résumer, les temps de téléchargement sont quasi identique pour JSON, Plist et Plist binaire et bien plus élevé pour XML. Quant au temps de chargement des données (pour en faire un truc utilisable en code), elles sont énormes en XML bien entendu, en JSON acceptable, Plist standard plus rapide que JSON et Plist binaire carrément infime, et pour cause c'est prévu pour être utilisé par NSDictionary et NSArray directement.
Pour les formats Plist la présentation disaient d'utiliser WebObject pour les gérer aussi simplement que sur le client (ndlr. en une seule ligne de code que ce soit pour l'import ou l'export) ou de voir des lib alternative qui existe.
Ma question est donc, que connaissez vous comme lib capable de sortir du Plist sur un web service ou encore mieux, du plist binaire ? Cela pourrait être intéressant de se constituer une liste comparative de ces librairies.
Pour ma part je n'en connait pas pour le moment :-/
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
http://plist.rubyforge.org/
En binaire ça va être plus dur... puisque le but n'est pas de le compresser après téléchargement hein... mais sur le serveur.
En revanche, je suis étonné qu'un PLIST standard soit plus rapide que le JSON ?
http://jeena.net/
http://github.com/jeena/plistifier
C'est malin ça, moi qui suit en train d'attaquer ma synchro en JSON, je fais quoi maintenant ?
Or il me semblait que le format binaire des Plist était un peu obscur, en tout cas non documenté (genre format fermé), j'ai pas souvenir d'avoir la spec (justement pour si on veut implémenter ça dans d'autres langages côté serveur)... des infos sur ce format binaire ?
Il n'y a pas de fonction type initWithContentsOfURLForBinaryPlist ?
Yoann a l'air de dire que NSArray sait les lire directement les binaires ? Vraiment ? Il ne faut pas passer par NSData ?
http://developer.apple.com/mac/library/documentation/cocoa/conceptual/propertylists/Introduction/Introduction.html
Et pour ceux que ça intéresse (ruby) :
http://gist.github.com/303378
Ceux qui préfèrent PHP :
http://code.google.com/p/cfpropertylist/
Tu dois même le faire sans le savoir.
Quand tu initialises ton NSArray ou NSDict avec un plist, tu n'as pas besoin de savoir si ce dernier est binaire ou XML (ou même ASCII, ancien format encore supporté en lecture et encore utilisé par ex. pour les TextMacros), tu lui files le path et il le lit tout seul...
J'ai toujours lu des plists "normaux" donc je ne le savais pas.
Du coup, ça devient très intéressant tout ça puisque ça marche nativement avec initWithContentsOfUrl.
Je reste sceptique que ce soit plus light que JSON quand-même parce qu'au fond un PLIST est un XML "spécialisé".
(je parle ici du poids et non du parsing)... mais si Apple le dit !
Pour les plist binaires, ils sont très utilisés sous OSX, tous les plist des préférences ou la plupart des plist aux divers endroits du système sont au format binaire depuis quelques versions majeures de OSX, justement car leur parsing est optimisé (normal, c'est déjà parsé en fait, c'est juste du fread de données déjà préparées).
Et Property List Editor tout comme un initWithContentsOfFile peuvent les lire sans broncher, qu'ils soient binaires ou XML ou ASCII.
Mais justement le seul moyen que je connais à ce jour de générer un plist binaire, c'est justement en Cocoa également, en utilisant les méthodes appropriées (d'ailleurs je me demande si les méthodes "writeToFile:atomically:" de NSDictionary et NSArray ne créent pas des fichiers plist binaires également).
A vrai dire, vu que j'ouvre les fichiers plist soit avec du code Cocoa, soit en double-cliquant dessus ce qui ouvre Property List Editor, soit avec "plutil -convert xml1" justement, bah je fais même pas gaffe si le plist est binaire ou XML tellement c'est transparent du coup : y'a qu'en l'ouvrant avec un éditeur de texte qu'on voit si c'est le cas ou pas.
Note que si tu veux tester, et te faire un plist binaire, soit tu le fais par le code, mais sinon la commande "plutil" ou même Property List Editor te permettent de sauver au format de ton choix, XML ou binaire.
Ce qui serait intéressant donc, c'est de savoir si c'est possible simplement, et comment (détails des specs du format binaire ?), de générer des plist binaires... depuis autre chose que MacOSX ou du code Cocoa. En particulier côté serveur. Y'a donc les libs Ruby que tu as citées, mais tout le monde n'utilise pas Ruby d'une part, et d'autre part ça m'intéresserait de connaà®tre le format et de savoir si c'est juste du retroengineering ou basé sur des specs officielles.
Chose plus intéressante par contre, la gestion des plist fait partie de CoreFoundation, donc dispo sur Apple Open Source http://www.opensource.apple.com/source/CF/CF-550/
C'est vraiment qu'ouvrant mes PLISTS avec Property List Eitor, je me suis jamais trop posé la question du format binaire ou XML.
J'avais mis un lien vers un plugin PHP au dessus...
J'ai installé le plugin Ruby, je vais tester ça.
Je vais vous faire un petit retour.
Côté serveur :
Ce qui donne en téléchargement ceci (capture 1).
Avez-vous remarqué dans le finder la preview (capture 2) où on voit le XML.
En revanche, dans TextMate, mon éditeur de texte favori, le fichier est bien compressé... (capture 3)
C'est beau la technologie et l'intégration Apple !
Deci étant dit, je pense quand même me tourner vers JSON qui est plus universel que les PLIST (d'autant plus que je veux l'apprendre).
De mon coté je suis entrain de tester la lib php et elle est bien sympa !
Voici un extrait de code de test :
PHP
Avec ces 30 lignes de code j'ai une sortie Plist Binaire de ma base SQL... C'est un peut crade vu que je sort toute la table pour mes test mais il n'y a pas grand chose a rajouter pour avoir des limites...
Et sur l'iPhone :
Pareil, ça mériterais plus de test et un mode asynchrone, mais j'aime bien :-)
Seule chose, quelqu'un sait en quel encodage de caractère doivent être les plist binaire ? mes champs sont en UTF8 sur le serveur et pourtant mes accents saute dans le transfert
code client Xcode :
Oh le bel accent : :P
Résultat :
2010-06-18 19:13:21.218 vinocella[31202:207] fr_name: Clémentine
C'est possible. Pourtant le plugin que j'utilise s'appuie sur le cousin du plugin PHP que tu utilises, à savoir cfpropertylist...
Euh essayer en PHP ? Tu m'as bien vu ? 8--) Le PHP je l'utilise que quand c'est obligatoire pour moi...
Je ne regretterai jamais mon passage à ruby et rails il y a 3 ans.
T'es sûr que tout est en UFT-8 chez toi ? Serveur, site... ?
Perso je suis plus Python, je hais le PHP ^^ Mais malheureusement peut d'hébergeur mutualisé ont le ruby dispo...
Pour ce qui est de l'UTF 8, je dirais que oui mais je ne suis pas expert en la matière, voici l'export SQL depuis PHPMyAdmin :
Je n'ai pas l'impression d'avoir oublié un truc... Au pire je vais tout recréer pour voir si j'ai pas loupé un truc.
Pour ta base, oui elle semble être en UTF-8 mais le soucis vient p-e de pas de là .
Par exemple, bien qu'ayant une base en UTF-8, j'étais obligé de forcer le fonctionnement de la base en UTF-8 il y a encore 2 ans :
Aujourd'hui, c'est fait par défaut dans Rails.
Peux-tu mettre à quoi ressemble ton Plist ?
Mais du coup je ne comprend pas d'où viens le problème la, à moins qu'il y a une options spéciale avec PHP pour lui dire de bosser en UTF-8 ?
De mon côté, à force d'aller-retours avec l'auteur du plugin Rails, on a ajouté :
- la création d'un dictionnaire arbitraire possible (sans données provenant de la base)
- la possibilité de donner un nom au fichier plist sortant
- et bientôt la possibilité de traiter un plist entrant pour le convertir en array ruby ou hash...
Je me suis rajouter une petite NSOperation fait pour le chargement sur URL de NSArray/NSDictionary et roulez !
Je pense qu'aujourd'hui, autant que possible je vais travailler avec les plist binaires, d'autant que ce n'est que très peut de code a rajouter sur les webservices
On peut donc maintenant envoyer un PLIST binaire en POST et récupérer les données en PARAMS côté serveur, parsing automatique. <br />
Ainsi, en cocoa :
et côté serveur, voilà ce qui est décortiqué :