Question

Je l'ai mis en place une sauvegarde sur applicationWillTerminate et charge sur applicationWillFinishLoading. Il y a un arbre d'objet complet, tout mettre en œuvre le protocole NSCoding et j'ai vérifier les types que je vous trouvez.

Une des classes stocke également un NSMutableData au NSKeyedArchive, que je soupçonne cela pourrait casser désarchivage de temps en temps. Bizarrement, parfois cela fonctionne et parfois non. Je soupçonne un certain contenu dans le NSMutableData cassera l'archivage.

J'utilise encodeObject sur tous les objets, à l'exception des bools et int où j'utilise la méthode correspondante correcte (encodeBool:forKey: et encodeInt:forKey:)

Pour être plus clair:. Le code ne fonctionne pas vraiment, est parfois capable de reconstruire un objet graphique assez complet, mais pas tout le temps

Le message d'erreur que je reçois est:

initForReadingWithData incomprehensible archive 0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30

Ajout: le code qui échoue, il NSMutableData un de 10+ MB

- (void)encodeWithCoder:(NSCoder*)encoder {
[encoder encodeObject:self.encodedMessage forKey:@"EncodedMessage"]; //NSData
[encoder encodeObject:self.data forKey:@"Data"]; //NSMutableData (10+MB)
[encoder encodeObject:self.header forKey:@"Header"]; //NSString
[encoder encodeObject:self.fileName forKey:@"FileName"]; //NSString
[encoder encodeInt:self.dataStartIndex forKey:@"DataStartIndex"]; //int
[encoder encodeInt:self.dataEndIndex forKey:@"DataEndIndex"]; //int
}

- (id)initWithCoder:(NSCoder*)decoder {
    if (self = [super init]) {
        self.encodedMessage = [decoder decodeObjectForKey:@"EncodedMessage"]; //NSData
        self.data = [decoder decodeObjectForKey:@"Data"]; //NSMutableData
        self.header = [decoder decodeObjectForKey:@"Header"]; //NSString
        self.fileName = [decoder decodeObjectForKey:@"FileName"]; //NSString
        self.dataStartIndex = [decoder decodeIntForKey:@"DataStartIndex"]; //int
        self.dataEndIndex = [decoder decodeIntForKey:@"DataEndIndex"]; //int
    }

    return self;
}

Lorsque je supprime l'encodage et le décodage de self.data il semble toujours fonctionner. Elle ne tient pas avec la taille self.data plus petite. Ne semble pas la taille mais question contenu?

Essayé pour ouvrir le fichier quand j'ai écrit le nsmutabledata à lui, l'éditeur de liste propertly affiche l'erreur:

"Conversion of string failed. The string is empty."

plutil donne aussi cette erreur:

"$ plutil -lint nzbvortex.state nzbvortex.state: Conversion of string failed. The string is empty."
Était-ce utile?

La solution 2

Il semble que plus de magasin autour de 230000 octets via un NSMutableArray provoquera la NSKeyedArchiver pour créer un fichier plist cassé.

220000 œuvres, 250000 ne l'ont pas. Ne chercher le montant exact qui est autorisé.

Autres conseils

FWIW J'ai aussi rencontré ce problème et voici ce que j'ai trouvé.

Les octets signalés 0x62, 0x70, 0x6C, etc., font partie de la chaîne magique « bplist » au début d'une liste de propriétés binaires, qui NSKeyedArchiver utilise par défaut.

A métadonnées liste de biens binaire stocke dans une remorque (à savoir à la fin des données). Donc, si elle est tronquée, l'ensemble plist devient illisible.

Si vous voulez vérifier si c'est ce qui vous est arrivé, vous pouvez utiliser NSPropertyListReader_binary1 de Cocotron ( http://code.google.com/p/cocotron/source/browse/Foundation/NSPropertyList/ ) pour voir comment fonctionne le format de fichier.

Espérons que cela aide quelqu'un!

Pour la bool et int, il y a deux méthodes: encodeBool:forKey: et encodeInt:forKey: (extrait du répertoire NSKeyedArchiver référence ).

Pour la NSMutableData, vous devez les archiver avec encodeObjectForKey: et les désarchiver avec decodeObjectForKey:.

Vous pouvez consulter cette guide utile pour plus de cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top