IRC上有人告诉我,我可以直接从plist文件中创建目标c对象,这样我就不必在任何地方为字符串的序列化/反序列化指定字符串。
有谁知道怎么做?
我想简单地拥有像这样的plist
<array>
<object>
<id>my unique id</id>
<description>first items description</description>
</object>
</array>
并以某种方式将其直接反序列化为目标c对象,而无需在代码中的任何位置指定文字字符串“description”或“id”。
这可能是不可能的,但我无法在网上或在SO上找到这样做或者说这是不可能的。
另外,我想跟进IRC家伙说的话,但是没有时间在那里问他。
非常感谢任何帮助,
-Vandelizer
答案 0 :(得分:4)
您正在寻找班级序列化。 Apple有一个关于它的对象存档方法的指南here。一些搜索关键词是“档案”“NSCoder”和“序列化”。
基本上你想让你的类实现NSCoding接口。然后,您可以创建方法-(void)encodeWithCoder:(NSCoder*)coder
和- (id)initWithCoder:(NSCoder *)coder
。前者用于写入数据,后者用于从数据创建对象。有关如何实现这些方法的信息,请参阅“编码和解码对象”部分。
然后,当你想写一个文件时,你可以创建一个对象的NSArray,并调用[NSKeyedArchiver archiveRootObject:toFile:]
将数组写入文件,然后[NSKeyedUnarchiver unarchiveObjectWithFile:]
来读取文件。 / p>
答案 1 :(得分:2)
根据定义,plist包含以下任何类型:数组,字典,字符串,实数,整数,布尔值,日期和数据)。如果您使用的是真正的plist,则可以使用一行代码实例化它包含的对象。请参阅NSPropertyListSerialization方法:
propertyListFromData:mutabilityOption:format:errorDescription
二进制plists,可以包含任何对象,可以使用NSKeyedArchiver和NSKeyedUnarchiver进行编写和读取。要使用这些,你必须采用NSCoding协议这里是一个从NSObject继承的对象中的这些方法的一个例子,它有两个属性:userId和userEmail。
+ (void) initialize
{
[self setVersion:1]; // increment when you object format changes (add or remove properties)
}
- (id) initWithCoder:(NSCoder *)coder
{
if (self = [super init])
{
NSInteger storedClassVersion = [coder versionForClassName:NSStringFromClass([self class])];
self.userId = [coder decodeObjectForKey:@"userid"];
self.userEmail = [coder decodeObjectForKey:@"useremail"];
if (storedClassVersion > 1)
{
// Use this block to conditionally read properties in versions greater than 1
}
}
return self;
}
- (void) encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.userId forKey:@"userid"];
[coder encodeObject:self.userEmail forKey:@"useremail"];
}
归档时,我发现将所有要保留在NSDictionary中的对象包装起来很有用。这允许您在取消归档时按键查找单个对象。 NSDictionary支持NSCoding协议,因此非常容易实现。
答案 2 :(得分:1)
值得注意的是,有两种归档器;一个'哑'',它只是持久化对象图,一个'keyed'一个允许数据结构随时间演变。键控归档器是一个更好的选择(也是首选),因为您可以将存储元素类型与持久存储时间分开。
答案 3 :(得分:1)
您可能正在寻找或不寻找对象的序列化。如果要读取XML plist中的值,并且其中的值都是有效的plist类型,那么只需将XML吸入NSString,然后向它发送-propertyList消息。你会得到一个id,其类型将取决于所讨论的plist中的内容。