Pb de sérialisation!

tabliertablier Membre
08:46 modifié dans API AppKit #1
Pour des raisons d'édition par un utilisateur λ, je souhaite sauver le dictionnaire "langues" sous forme .strings. En cherchant un peu dans la doc et en copiant l'exemple donné dans "Property List Programming Guide for Cocoa" j'ai écrit:
NSString	*error ;<br />NSData		*pData ;<br />BOOL 	 	tic ;<br /><br />&nbsp; tic = [NSPropertyListSerialization propertyList:langues<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  isValidForFormat:NSPropertyListOpenStepFormat] ;<br />&nbsp; if (tic)<br />&nbsp; &nbsp;  pData = [NSPropertyListSerialization dataFromPropertyList:langues<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  format:NSPropertyListOpenStepFormat<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  errorDescription:&amp;error] ;<br />&nbsp; else<br />&nbsp; &nbsp;  {&nbsp;  ....... traitement de l&#39;erreur .......... } ;<br />

isValidForFormat: retourne YES, mais à  la ligne suivante pData = .... j'obtiens l'erreur :
"Property list format kCFPropertyListOpenStepFormat not supported for writing"
Je ne comprends pas l'erreur que je fais! L'exemple d'Apple serait-il faux? Dans la documentation je ne trouve nulle part de restriction à  l'utilisation de kCFPropertyListOpenStepFormat!

Qui peut m'aider la dessus?

PS: Je suis sous 10.4.11 avec Xcode 2.5

Réponses

  • AliGatorAliGator Membre, Modérateur
    08:46 modifié #2
    ben heu... dans la page "NSPropertyListSerialization Class Reference" quand on regarde la partie "Constants" et cette constante "NSPropertyListOpenStepFormat", on y lit quand même clairement :
    Important: The NSPropertyListOpenStepFormat constant is not supported for writing. It can be used only for reading old-style property lists.
    donc bon y'a rien de plus clair...

    Au fait en passant si c'est pour sauver un dictionnaire sous forme de fichier "strings", que vient faire l'utilisation d'un NSPropertyListSerialization ?
    Les fichiers .strings sont juste des fichiers textes où tu as une ligne par clé, suivi d'un "=" suivi de sa valeur, et ça ne marche que pour les dictionnaires ne contenant que des chaà®nes (pour les clés comme pour les valeurs, et sur un seul niveau hérarchique), puisque c'est fait pour la localisation/traduction.

    Après j'ai plus trop souvenir du format "OpenStep" des fichiers PLIST (on a + connu le format XML puis ensuite le format binaire) mais je crois que ça ressemblait plutôt à  une structure avec des accolades { } pour quand on décrivait un NSArray ou NSDictionary, avec une indentation selon le niveau de profondeur etc... qui ne correspond pas au cas limitatif des fichiers .strings !


    Je me demande si ça ne vaut pas le coup plutôt de faire la procédure d'écriture de ton NSDictionary "langues" toi-même. Je ne sais pas quelle est sa structure, mais si c'est un NSDictionary donc les clés sont les noms des constantes et les valeurs sont la valeur associée à  cette constante pour la langue en cours.. Bah un simple parcours de ton NSDictionary (avec une fast-enumeration avec foreach pourquoi pas) et écrire dans un NSString le format [tt]"%@ = %@\;n",key,value[/tt] pour chaque entrée du dico... et écrire cette chaà®ne enfin dans un fichier... et le tour est joué en 5 lignes ;)
  • tabliertablier Membre
    08:46 modifié #3
    >:( et M...., je suis carrément passé à  coté.
    Effectivement mon problème est un problème de traduction par des gens qui n'y connaissent rien, mais qui sont capables d'utiliser un éditeur de texte.
    Pour info le dictionnaire ne comporte que des strings. Faire la sortie "à  la main", je l'ai fait. Je cherche quand même quelque chose de tout fait pour simplifier.
    Enfin, merci de m'avoir remis sur les bon rails  :P
  • AliGatorAliGator Membre, Modérateur
    08:46 modifié #4
    dans 1229620145:
    Je cherche quand même quelque chose de tout fait pour simplifier.
    ben heu sans vouloir m'avancer je suis pas sûr que ça existe ;)

    (En même temps si c'est codable en 5 lignes...)
  • tabliertablier Membre
    décembre 2008 modifié #5
    J'avais essayé ta solution:
    un simple parcours de ton NSDictionary (avec une fast-enumeration avec foreach pourquoi pas) et écrire dans un NSString le format "%@ = %@\;n",key,value pour chaque entrée du dico... et écrire cette chaà®ne enfin dans un fichier... et le tour est joué en 5 lignes

    Si je me rapelle bien, le problème était que les caractères spéciaux n'étaient pas re-codés: Cr et Lf  => \n et \r, \ => \\, Tab => \t, " => \" ......etc
    C'est la raison qui m'avais fait écrire une sortie "A la main". Suite a ta réponse, j'ai trouvé dans la doc une méthode très simple qui laisse au système le soin du recodage:
    NSMutableData       *txtFinal ;
    NSMutableString        *analyse ;
    NSMutableDictionary  *identic ;

        // Initialisations des objets et remplissage des contenus
        // identic contient les 'properties'
       
      [analyse setString:@/* Le titre */\n\n] ;
      [analyse  appendString:[identic descriptionInStringsFileFormat]] ;
      [analyse appendString:[NSString stringWithString:@\;n/*
    */\n"]] ;
      [txtFinal setData:[analyse dataUsingEncoding:NSUnicodeStringEncoding]] ;
      [txtFinal writeToFile:lasortie atomically:NO] ;

    Et ça marche comme je le souhaite. :P
  • AliGatorAliGator Membre, Modérateur
    08:46 modifié #6
    ??? Ah ben je connaissais pas [tt]descriptionInStringsFileFormat[/tt] en effet ! En plus avec un nom de méthode si explicite...
    Bien vu  ;)
Connectez-vous ou Inscrivez-vous pour répondre.