Цель C: Сериализация / Архивирование - PullRequest
2 голосов
/ 28 сентября 2011

Я разработчик Android, который недавно начал IOSing. Во всех моих проектах на Android есть класс ввода-вывода, который выполняет следующие действия:

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 Ответ

1 голос
/ 28 сентября 2011

В вашем +loadForKey:

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

вы пытаетесь читать из пустого объекта данных. Создание изменяемого объекта данных с использованием [NSMutableData data] просто дает вам объект, который ничего не содержит. Вам нужно будет прочитать данные откуда-то. Аналогично, в вашем +saveObject:forKey: вы успешно архивируете объект, но ничего не делаете с результирующим объектом данных.

Чтобы исправить, вам нужно записать данные в файл или URL-адрес в вашем методе сохранения и прочитать их из файла или URL-адреса в вашем методе загрузки.

...