【问题标题】:NSKeyedArchiver/Unarchiver and a custom NSArray subclass unarchives to a different subclassNSKeyedArchiver/Unarchiver 和自定义 NSArray 子类取消归档到不同的子类
【发布时间】:2014-01-01 01:07:22
【问题描述】:

我有一个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"];
}

【问题讨论】:

    标签: objective-c nskeyedarchiver nscoding


    【解决方案1】:

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

    这是 NSPropertyListSerialization 的“特性”,因为属性列表是文本的,不包含明确的类型信息。如果您想包含所有类型信息,您需要使用不同类别的归档器,请检查 NSArchiver。

    不过,根据我对您的情况的了解,我可能会建议您在读入时将数组更改回您想要的类型,这样您就可以继续使用漂亮的文本格式。

    比如,你可以这样做:

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

    【讨论】:

    • 我正在使用NSKeyedArchiver。 “NSKeyedArchiver/Unarchiver”是我问题标题中的第一件事,我给出了-initWithCoder:encodeWithCoder: 的实现。我很清楚NSPropertyListSerialization 不存储类型信息,但我也知道NSKeyedArchiver 写入属性列表。我只使用NSPropertyListSerialization 来查看编码器到底在编码什么,问题是NSKeyedArchiver 没有存储正确的类型信息。
    • 我相信类集群存档很奇怪。我上面提供的代码 sn-p 将解决这个问题。一般来说,我强烈建议不要对像 NSArray 这样的集群进行子类化,原因有很多。
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多