使用新的 NSKeyedUnarchiver API 取消归档数据,但未能满足所需的 unarchivedObjectOfClass

Posted

技术标签:

【中文标题】使用新的 NSKeyedUnarchiver API 取消归档数据,但未能满足所需的 unarchivedObjectOfClass【英文标题】:Unarchiving data with new NSKeyedUnarchiver APIs while failed to satisfied unarchivedObjectOfClass it required 【发布时间】:2021-08-08 07:47:34 【问题描述】:

首先,我要感谢大家阅读了该消息并以任何形式给我反馈。

这就是我想要做的。将 Objective-c 中已弃用的 API [NSKeyedUnarchiver unarchiveObjectWithData:myProfileData]; 替换为 ios 12 新 API unarchivedObject<DecodedObjectType>(ofClass: DecodedObjectType.Type, from: Data) -> DecodedObjectType?

我使用旧的 NSKeyedUnarchived API 取消归档数据,打印出来,这是我得到的:

assets =     
        "albums" =         
            "more_Album" = 0;
            photos =             (
            );
        ;
    "shared_connections" = "<null>";

我的第一次尝试是打击,因为我知道我将数据归档为字典,所以我必须使用相同的类类型取消归档:

NSError *error = nil;
NSDictionary *dictionary = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] fromData:myData error:&error];

但是错误信息显示:

Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects' was of unexpected class 'NSNull (0x11c39fe80).
Allowed classes are '(
    "NSDictionary (0x11c39fa48)
)

我想可能是因为我没有在 unarchivedObjectOfClass 中包含 [NSNull class] 导致失败。为了满足吐槽,我继续发了一组unarchivedObject of classes

NSError *error = nil;
NSSet *classSet = [NSSet setWithObjects:[NSDictionary class], [NSNull class], nil];
NSDictionary *dictionary = [NSKeyedUnarchiver unarchivedObjectOfClasses:classSet fromData:myData error:&error];

很遗憾,又失败了。

Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects' was of unexpected class 'NSArray (0x11e79f778)

 Allowed classes are '(
    "NSDictionary (0x11e79fa48) ,
    "NSNull (0x11e79fe80) )'

我不确定在使用新的 NSKeyedUnarchiver API 时处理字典中的 Null 值的正确方法是什么。

【问题讨论】:

【参考方案1】:

我错了,我意识到我没有在 NSSet 中包含 NSArray class,这就是抱怨的来源。

【讨论】:

以上是关于使用新的 NSKeyedUnarchiver API 取消归档数据,但未能满足所需的 unarchivedObjectOfClass的主要内容,如果未能解决你的问题,请参考以下文章

错误处理 - NSKeyedUnarchiver

使用 NSKeyedUnarchiver 解码 URL 对象数组

NSKeyedUnarchiver 数据格式错误

iPhone - NSKeyedUnarchiver 内存泄漏

NSKeyedUnarchiver - 删除解码的数据?

NSKeyedUnarchiver - 需要尝试/捕获?