我有一个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"];
}
答案 0 :(得分:2)
当你使用属性列表序列化进行编码时,你将自己限制在基本的属性列表类型:数组,字符串,字典,数据,我现在忘记的其他一些...... docs are here.
这是NSPropertyListSerialization的“功能”,因为属性列表是文本的,不包含显式类型信息。如果要包含使用其他类型归档程序所需的所有类型信息,请检查NSArchiver。
但是,从我对你的案例知之甚少,我可能会建议你在阅读时将数组改回你想要的类型,这样你就可以继续使用漂亮的文本格式了。
喜欢,你可以这样做:
NSMutableArray *backingArray = [JOTypedMutableArray arrayWithArray:[aDecoder decodeObjectForKey:@"JOTypedMutableArrayContents"]];