【问题标题】:NSData Exception - "incomprehensible archive"NSData 异常 - “无法理解的存档”
【发布时间】:2012-05-17 03:26:31
【问题描述】:

所以我在尝试实现NSKeyedUnarchiver 时遇到了一个异常,因为我试图用NSUsersDefaults 保存一组自定义对象。因为我不断收到一个错误,说我有非属性,所以我决定将它们存档到NSData。现在我收到此错误:“无法理解的存档”。

这是我的归档方式(我已经测试所有对象都为空,但没有一个是):

NSMutableArray *array = [[NSMutableArray alloc] initWithArray:anotherArray];
for (int i = 0; i < array.count; i++) {
    CustomObj *obj = [array objectAtIndex:i];
    NSData *newdata  = [NSKeyedArchiver archivedDataWithRootObject:obj];
    [array replaceObjectAtIndex:i withObject:newdata];
}
NSArray *newArray = [[NSArray alloc] initWithArray:array];
[coder setObject:newArray forKey:@"key"];

这是我取消归档的方式(再次测试所有内容是否为空):

if (!arrayM) { arrayM = [[NSMutableArray alloc] init]; NSLog(@"initialized"); }
else {
    for (int i = 0; i < arrayM.count; i++) {
        NSData *data = [arrayM objectAtIndex:i];
        --> The exception happens here: CustomObj *obj  = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        [arrayM replaceObjectAtIndex:i withObject:obj];
    }
}

【问题讨论】:

    标签: ios nsuserdefaults nskeyedarchiver


    【解决方案1】:

    您没有使用 NSKeyedArchiver 将其存档,那么您为什么希望能够使用 NSKeyedUnarchiver 来取回数据?你想这样做的方式是这样的。使您的自定义对象符合 NSCoding 协议,并实现其两种方法(编码和解码)。然后,您可以在自定义对象数组上使用 NSKeyedArchiver 存档。 NSKeyedArchiver 将对每个对象及其包含的任何对象(如果它是一个集合)调用 encodeWithCoder。

    编辑:在 array 上调用 NSKeyedArchiver,而不是每个对象。然后当你解压它时,再把它解压到一个数组中。

    【讨论】:

    • 当我将它更改为上面的当前代码时,它仍然给我同样的错误。而且我确实有适当的编码方法。
    • @ManOx 所以你正在调用阵列上的键控归档程序,取回数据,并将该数据设置为默认值?然后当你读回它时,你会从默认值中获取数据并将 unarchive 调用到 NSArray 中?
    • 是的,我已经存档了项目并且我已经存档了整个数组。都没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多