如何将对象作为纯文本写入NSUserDefaults?
我为科学应用程序编写了一个单元转换系统,它基本上围绕“单元对象”的原理运行。这些对象表示在给定域中具有特定值的特定单元。域名由类名表示,因为所有内容都是有组织的,因此时间单位字面上称为“TimeUnit”,长度单位字面上称为“LengthUnit”。
“单位”的当前值由双精度表示,“单位”本身(即“米”,“开尔文”,“小时”,“磅”等)由NSString表示。
我需要能够将这些对象写入NSUserDefaults。
我已经使用NSCoding和NSKeyedArchiver实现了一个系统。这很好用,我可以存储和检索来自NSUserDefaults的单位,一切正常。
问题是NSKeyedArchiver的输出太大了。你从中获得的base64编码数据是这个巨大的字符块,这是不可能通过纯文本编辑器改变的,有些难以调试。我知道你可以通过在NSKeyedArchiver的setOutputFormat中使用NSPropertyListXMLFormat_v1_0来在某种程度上覆盖它,但即使这样也会产生一个相当冗长的输出,其中包含一大堆我并不真正关心的东西(我知道所有数据都是有原因的,但我猜这是因为NSKeyedArchiver旨在处理很多不同的情况。)
如果我可以使用自己的格式编码这些对象会容易得多。有点像:
class_name:double_value:unit_name
因此,温度单位的摄氏温度将达到22摄氏度:
TemperatureUnit:22:celsius
实现这样的目标的最佳方式是什么?我应该继承NSCoder吗?这会让我将对象存储为NSUserDefaults中的纯文本字符串而不是base64编码的二进制数据块吗?
答案 0 :(得分:1)
对于这样的事情,您可以添加“序列化”和“反序列化”方法(或任何您想要的名称)。前者返回一个字符串,后者接受一个字符串并返回你的对象。
+ (MyUnitClass *)deserialize:(NSString *)encodedString {
// split string, create new object, assign values
}
- (NSString *)serialize {
return [NSString stringWithFormat:@"%@:%f:%@", self.classname, self.double_value, self.unit_name];
}
现在,您可以在其中一个对象上调用serialize
并将字符串存储在NSUserDefaults
中。使用deserialize
从您在NSUserDefaults
中存储的字符串中创建对象。