首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSKeyedUnarchiver无法解码类NSKnownKeysDictionary1的对象

NSKeyedUnarchiver无法解码类NSKnownKeysDictionary1的对象
EN

Stack Overflow用户
提问于 2015-10-08 12:27:24
回答 2查看 4.6K关注 0票数 8

在使用Swift解压缩时,我会得到以下异常:

由于“NSInvalidUnarchiveOperationException”异常终止应用程序,原因:‘* -NSKeyedUnarchiver decodeObjectForKey::无法为键(NS.objects)解码类对象(NSKnownKeysDictionary1);类可以在源代码或未链接的库中定义

上下文:我正在创建一个“共享链接”扩展。在我的主应用程序(用目标C编写)中,我用MMWormhole编写了一组字典,其中包含有关链接的信息。

代码语言:javascript
复制
    NSFetchRequest* bookmarkFetch = [NSFetchRequest fetchRequestWithEntityName:@"XX"];
    bookmarkFetch.propertiesToFetch = @[
                                        @"name", @"text", @"date", @"url"
                                        ];
    bookmarkFetch.resultType = NSDictionaryResultType;
    NSArray* bookmarks = [moc executeFetchRequest:bookmarkFetch error:NULL];

    [wormhole passMessageObject:bookmarks identifier:@"XXX"];

数组中的值是NSStrings和NSDate。

在MMWormhole的肚子里你可以得到:

代码语言:javascript
复制
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject];

messageObject只是书签数组,没有任何中间处理。

在分机处,我有:

代码语言:javascript
复制
    let wormhole = MMWormhole(applicationGroupIdentifier: "group.XX", optionalDirectory:nil)
    let bookmarks = wormhole.messageWithIdentifier("XXX") as? Array<Dictionary<String,AnyObject>>

messageWithIdentifier:最终将其称为:

代码语言:javascript
复制
    id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];

数组被正确地写入应用程序组文件夹--我可以使用另一个扩展名读取它,其中一个扩展名写在目标C中。

当我在模拟器中运行时,会出现此异常。在32位设备(iPhone 5和iPad 3)上运行时,代码似乎工作正常.我目前没有64位设备可供测试。

我想我缺少了一个import或一个框架,但是哪一个呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-13 15:09:20

我在Apple论坛和苹果开发者关系部()的得到一个好的答案上问过这个问题。我将引用重要的部分:

NSKnownKeysDictionary1是一个我不明白的核心数据巫毒。..。显然,它的序列化和反序列化出现了问题。你在虫洞两端都有核心数据吗?无论如何,对书签数组进行深度复制(以及其他从Core Data获得的内容)可能更有意义,这样您就可以通过“连线”而不是通过Core数据发送标准字典。

因此,我的解决方案要么将核心数据框架添加到扩展中,要么进行深度复制。(我暂时做了前者。正确的解决办法可能是后者。)

票数 2
EN

Stack Overflow用户

发布于 2016-06-26 12:11:40

这只是一个附带说明:

您可以为NSKeyedArchiver & NSKeyedUnarchiver设置类名。在没有处理CoreData的情况下,我遇到了这个问题。档案管理员再也找不到我自己的班级了。

设置我的类的className如下所示:

对于archiver

代码语言:javascript
复制
NSKeyedArchiver.setClassName("MyClass", for: MyClass.self)
let data = NSKeyedArchiver.archivedData(withRootObject: root)

unarchiver

代码语言:javascript
复制
NSKeyedUnarchiver.setClass(MyClass.self, forClassName: "MyClass")
let root = NSKeyedUnarchiver.unarchiveObject(with: data)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33015794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档