NSMutableDictionary现在是将数据作为字符串截断,还是为长数据返回省略号?我使用这个功能来保存一个带有不同颜色的plist。自2005年左右以来,这种方法一直运行良好(只做了一些小的修改)。
但是上个月,我想在一次操作系统更新之后,我发现我所有的数据都开始被破坏了。我已经把范围缩小到这里了。当我运行这段代码..。
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之前,您可以使用此代码,它具有相同的错误。
[dict setObject:[NSArchiver archivedDataWithRootObject: [NSColor redColor]] forKey:@"backdropColor"];
当我运行其中任何一个时,我都会得到以下结果:
backdropColor = {length = 3576, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 00000d88 };
看到了吗...?这本不应该在那里的。它用来填写那个..。所有的数据。
我找不到任何文档来解释这一变化,虽然这段代码多年来一直保持不变,但它现在已经破坏了我的一个用户几个月的工作。
发布于 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和您的应用程序上可读的文件),您将需要编写自己的方法来复制该格式。
https://stackoverflow.com/questions/62746827
复制相似问题