NSKeyedArchiver / Unarchiver和自定义NSArray子类取消归档到不同的子类

时间:2014-01-01 01:07:22

标签: objective-c nskeyedarchiver nscoding

我有一个NSMutableArray的子类(对包含的对象强制执行某些限制所必需的)。我像往常一样对数组进行编码,然后对其进行解码。问题是虽然编码类(赋予NSKeyedArchiver)是JOTypedMutableArray,但输出类是NSMutableArray的另一个子类(其中一个是私有的)。

我查看了LLDB的归档数据:po [NSPropertyListSerialization propertyListFromData:archivedData mutabilityOption:0 format:NULL errorDescription:NULL]。该命令的输出包含:

"$classes" = (
    NSMutableArray,
    NSArray,
    NSObject
);
"$classname" = NSMutableArray;

在我看来,当归档程序被赋予类集群的子类时,它被设置为忽略具体的子类并编码为抽象超类。

这里的问题是:如何强制归档器正确编码对象? (或者我在这里做错了什么?)

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        NSString *stringType = [aDecoder decodeObjectForKey:@"JOTypedMutableArrayType"];
        Class classType = NSClassFromString(stringType);
        _type = classType;

        NSMutableArray *backingArray = [aDecoder decodeObjectForKey:@"JOTypedMutableArrayContents"];
        _jo_backingArray = backingArray;
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:NSStringFromClass(self.type) forKey:@"JOTypedMutableArrayType"];
    [aCoder encodeObject:self.jo_backingArray forKey:@"JOTypedMutableArrayContents"];
}

1 个答案:

答案 0 :(得分:2)

当你使用属性列表序列化进行编码时,你将自己限制在基本的属性列表类型:数组,字符串,字典,数据,我现在忘记的其他一些...... docs are here.

这是NSPropertyListSerialization的“功能”,因为属性列表是文本的,不包含显式类型信息。如果要包含使用其他类型归档程序所需的所有类型信息,请检查NSArchiver。

但是,从我对你的案例知之甚少,我可能会建议你在阅读时将数组改回你想要的类型,这样你就可以继续使用漂亮的文本格式了。

喜欢,你可以这样做:

NSMutableArray *backingArray = [JOTypedMutableArray arrayWithArray:[aDecoder decodeObjectForKey:@"JOTypedMutableArrayContents"]];