当前位置:  开发笔记 > IOS > 正文

如何在iPhone sdk中序列化一个简单的对象?

如何解决《如何在iPhonesdk中序列化一个简单的对象?》经验,为你挑选了2个好方法。

我有一个对象字典; 它们都是应该可序列化的POCO对象.我应该用什么技术将它们写入磁盘.我正在寻找最简单的选项来编写一些列表来保存状态.

我想我有3个选择.

    plist文件.然而,这似乎仅限于存储预定义的对象(字符串,数字等)而不是对象(如具有名称和年龄的人).

    CoreData.(3.0中的新功能)这样可以正常工作; 但是我的数据模型需要改变以使其工作.这将是一个巨大的返工,我不确定是否值得努力.

    SQLLite.实现一个简单的SQL数据库来读取和读取.我已经对此进行了最少的研究,但我不想"重写"一些核心数据ORM函数.

stefanB.. 33

要序列化自定义对象,您只需要符合NSCoding协议.如果你的对象扩展了NSObject,你需要做的就是(我相信)实现这些(例如person对象的例子):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArray并且NSDictionary已经实现了序列化的方法.它们将序列化它们拥有的所有对象(如果对象实现了NSCoder接口 - 如果它们扩展了NSObject,它们会这样做).NSObject中的encodeWithCoderinitWithCoder所以,除非你实现你的类没有自己的代码做默认情况下没有被序列化.

如果你有NSArray或NSDictionary对象,你可以使用以下方法同步它们:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;


Marc W.. 14

您可以像在Mac OS X上一样执行此操作:您的POCO必须符合NSCoding协议.请参阅此处以获取概念参考,此处为NSCoding参考.

如果数据并不那么疯狂,并且您的对象之间没有可笑的复杂关系,那么将所有内容写成plist可能是您的最佳选择; 它的执行速度非常快,并且在代码中实现起来非常简单.就像你说的,CoreData可能需要做很多额外的工作来调整你的代码,sqlite真的只适用于存储完美存储在关系数据库中的数据.请记住,与使用二进制plist相比,sqlite也更慢并且使用更多资源.



1> stefanB..:

要序列化自定义对象,您只需要符合NSCoding协议.如果你的对象扩展了NSObject,你需要做的就是(我相信)实现这些(例如person对象的例子):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArray并且NSDictionary已经实现了序列化的方法.它们将序列化它们拥有的所有对象(如果对象实现了NSCoder接口 - 如果它们扩展了NSObject,它们会这样做).NSObject中的encodeWithCoderinitWithCoder所以,除非你实现你的类没有自己的代码做默认情况下没有被序列化.

如果你有NSArray或NSDictionary对象,你可以使用以下方法同步它们:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;



2> Marc W..:

您可以像在Mac OS X上一样执行此操作:您的POCO必须符合NSCoding协议.请参阅此处以获取概念参考,此处为NSCoding参考.

如果数据并不那么疯狂,并且您的对象之间没有可笑的复杂关系,那么将所有内容写成plist可能是您的最佳选择; 它的执行速度非常快,并且在代码中实现起来非常简单.就像你说的,CoreData可能需要做很多额外的工作来调整你的代码,sqlite真的只适用于存储完美存储在关系数据库中的数据.请记住,与使用二进制plist相比,sqlite也更慢并且使用更多资源.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有