目标 C:序列化/归档问题
Posted
技术标签:
【中文标题】目标 C:序列化/归档问题【英文标题】:Objective C: Serializing/Archiving issues 【发布时间】:2011-09-28 18:59:52 【问题描述】:我是一名 android 开发人员,最近开始使用 iosing。在我所有的 Android 项目中,我都有一个执行以下操作的 IO 类:
public static Object load(String fname , Context cont)
FileInputStream fis = cont.openFileInput(fname);
ObjectInputStream ois = new ObjectInputStream(fis);
Object loadedObject = ois.readObject();
ois.close();
fis.close();
Father.print("Loaded from file "+fname+" successfully");
return loadedObject;
和保存的等价物。它工作得很好,我可以用它加载和保存任何实例。
在 Objective C 中,我使用的是 NSKeyedArchiver/NSKeyedUnarchiver。存档似乎有效,但取消存档会导致:
*** -[NSKeyedUnarchiver initForReadingWithData:]: data is empty; did you forget to send -finishEncoding to the NSKeyedArchiver?
我正在使用以下静态方法:
+(BOOL)saveObject: (id<NSCoding>)obj forKey:(NSString*)key;
NSKeyedArchiver *archiver;
NSMutableData *bytes = [NSMutableData data];
archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:bytes];
[archiver encodeObject:obj forKey:key];
[archiver finishEncoding];
NSLog(@"Successfully saved object <%@> to %@", obj, key);
return TRUE;
和
+(id)loadForKey:(NSString*)key
NSMutableData *bytes = [NSMutableData data];
NSKeyedUnarchiver *unrar = [[NSKeyedUnarchiver alloc] initForReadingWithData:bytes];
id result = [unrar decodeObjectForKey:key];
[unrar finishDecoding];
NSLog(@"Successfully loaded object <%@>", result);
return result;
我这样称呼他们
[IVIO saveObject:thing forKey:@"thekey"];
Thing *miracle = [IVIO loadForKey:@"thekey"];
发生了什么事?
谢谢
【问题讨论】:
【参考方案1】:在你的+loadForKey:
NSMutableData *bytes = [NSMutableData data];
NSKeyedUnarchiver *unrar = [[NSKeyedUnarchiver alloc] initForReadingWithData:bytes];
您正试图从一个空的数据对象中读取。使用[NSMutableData data]
创建一个可变数据对象只会给您一个不包含任何内容的对象。您需要从某处读取数据。同样,在您的 +saveObject:forKey:
中,您成功存档了对象,但您不对生成的数据对象执行任何操作。
要解决此问题,您需要在 save 方法中将数据写入文件或 URL,并在 load 方法中从文件或 URL 中读取。
【讨论】:
好吧,我想我明白我的误解了。我的意思是将数据保存到持久存储中,但所做的只是扁平化数据。谢谢你。不想要求太多,你能指出我保存到硬内存的正确方向吗? @soBinary:这完全取决于你。 NSMutableData 继承了读写的方法,NSFileHandle 可以读写数据。我相信还有其他选择。以上是关于目标 C:序列化/归档问题的主要内容,如果未能解决你的问题,请参考以下文章