首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSMutableDictionary现在是将数据作为字符串截断还是添加省略号?看起来是这样,在这里

NSMutableDictionary现在是将数据作为字符串截断还是添加省略号?看起来是这样,在这里
EN

Stack Overflow用户
提问于 2020-07-06 06:05:43
回答 1查看 48关注 0票数 0

NSMutableDictionary现在是将数据作为字符串截断,还是为长数据返回省略号?我使用这个功能来保存一个带有不同颜色的plist。自2005年左右以来,这种方法一直运行良好(只做了一些小的修改)。

但是上个月,我想在一次操作系统更新之后,我发现我所有的数据都开始被破坏了。我已经把范围缩小到这里了。当我运行这段代码..。

代码语言:javascript
运行
复制
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            NSError *error = nil;
            [dict setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSColor redColor] requiringSecureCoding:NO error:&error] forKey:@"backdropColor"];
            
            NSString *test = [dict description];

请注意,在MacOS 10.13之前,您可以使用此代码,它具有相同的错误。

代码语言:javascript
运行
复制
            [dict setObject:[NSArchiver archivedDataWithRootObject: [NSColor redColor]] forKey:@"backdropColor"];

当我运行其中任何一个时,我都会得到以下结果:

代码语言:javascript
运行
复制
    backdropColor = {length = 3576, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 00000d88 };

看到了吗...?这本不应该在那里的。它用来填写那个..。所有的数据。

我找不到任何文档来解释这一变化,虽然这段代码多年来一直保持不变,但它现在已经破坏了我的一个用户几个月的工作。

EN

回答 1

Stack Overflow用户

发布于 2020-07-06 08:49:49

将我们的一些评论转化为答案:

-[NSObject description]并不是一种通用的解析/序列化格式,随着时间的推移,对象的描述可能会发生变化。在macOS Catalina中,对NSData的描述更改为截断中间的内容,以避免充分显示大量的数据blobs。

目前,我将大量对象抛入到NSData中,然后使用描述将其导出到plist中,然后可以很容易地将其解析回NSData对象。这就是它所需要做的,正确地将一个NSData对象转储出来并读回它。

根据您的最低要求,最简单的解决方案就是将NSData对象直接存储在您的plist中,而不是它们的-description中。plist格式本机支持二进制数据,所有基础工具(如NSPropertyListSerialization)都将接受NSData实例直接写入磁盘。

如果您想显式地将二进制数据转换为可安全往返的字符串,请考虑使用-[NSData base64EncodedStringWithOptions:]将其转换为base64编码的字符串,将该字符串存储在plist中,稍后再使用-[NSData initWithBase64EncodedString:options:]进行检索。

但是,如果您需要向后兼容旧格式(例如,在macOS Catalina和更新版本上运行的应用程序的版本必须能够保存在旧版本的macOS和您的应用程序上可读的文件),您将需要编写自己的方法来复制该格式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62746827

复制
相关文章

相似问题

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