gpt4 book ai didi

objective-c - 归档/取消归档导致 initForReadingWithData 无法理解的归档

转载 作者:太空狗 更新时间:2023-10-30 04:02:58 25 4
gpt4 key购买 nike

我在 applicationWillTerminate 上实现了保存并在 applicationWillFinishLoading 上加载。有一个完整的对象树,都实现了 NSCoding 协议(protocol),我检查了我输入的类型。

其中一个类还将 NSMutableData 存储到 NSKeyedArchive,我怀疑这偶尔会破坏解档。奇怪的是,有时它会起作用,有时却不起作用。我怀疑 NSMutableData 中的某些内容会破坏归档。

我在所有对象上使用 encodeObject,除了 bool 和 int,我使用正确的相应方法(encodeBool:forKey:encodeInt:forKey:)

更清楚一点:代码确实有效,有时它能够重建一个相当完整的对象图,只是不是所有时候。

我得到的错误信息是:

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

添加:失败的代码,它是一个 10+ MB 的 NSMutableData

- (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;
}

当我删除 self.data 编码和解码时,它似乎总是有效。它也因较小的 self.data 而失败。看起来不是尺寸而是内容问题?

当我向文件写入 nsmutabledata 时试图打开文件,属性列表编辑器显示错误:

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

plutil 也给出了这个错误:

"$ plutil -lint nzbvortex.state nzbvortex.state: Conversion of string failed. The string is empty."

最佳答案

FWIW 我也遇到过这个问题,这是我发现的。

报告的字节 0x62、0x70、0x6c 等是二进制属性列表开头的魔术字符串“bplist”的一部分,NSKeyedArchiver 默认使用它。

二进制属性列表将元数据存储在尾部(即数据末尾)。因此,如果它被截断,整个 plist 将变得不可读。

如果您想检查这是否发生在您身上,您可以使用 Cocotron (http://code.google.com/p/cocotron/source/browse/Foundation/NSPropertyList/) 中的 NSPropertyListReader_binary1 来查看文件格式的工作原理。

希望这对某人有帮助!

关于objective-c - 归档/取消归档导致 initForReadingWithData 无法理解的归档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com