我是一位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"];

这是怎么回事?

谢谢

最佳答案

在你的+loadForKey:

NSMutableData *bytes = [NSMutableData data];
NSKeyedUnarchiver *unrar = [[NSKeyedUnarchiver alloc] initForReadingWithData:bytes];

您正在尝试从空数据对象读取。使用[NSMutableData data]创建可变数据对象只会为您提供一个不包含任何内容的对象。您需要从某处读取数据。同样,在+saveObject:forKey:中,您成功地归档了对象,但是对结果数据对象不做任何事情。

要解决此问题,您需要使用保存方法将数据写入文件或URL,并通过加载方法从文件或URL中读取数据。

关于java - objective-c :序列化/归档问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7588155/

10-12 02:31