目标 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:序列化/归档问题的主要内容,如果未能解决你的问题,请参考以下文章

序列化与归档?

iOS序列化-归档

iOS序列化-归档

提升序列化:归档“不支持的版本”异常

iOS 对象的归档

iOS---归档与解档