Objective C: проблемы с сериализацией / архивированием

#java #objective-c #ios #serialization #archive

#java #objective-c #iOS #сериализация #Архив

Вопрос:

Я разработчик 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 resu<
}
  

Я называю их так

 [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: вы успешно архивируете объект, но ничего не делаете с результирующим объектом данных.

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

Комментарии:

1. Хорошо, я думаю, что понимаю свое недоразумение. Я имею в виду сохранение данных в постоянное хранилище, но все, что это делает, — это выравнивание данных. Спасибо. Не желая просить слишком многого, можете ли вы указать мне правильное направление для сохранения на жестком диске?

2. @soBinary: это полностью зависит от вас. NSMutableData наследует методы чтения и записи, а NSFileHandle может считывать и записывать данные. Я уверен, что есть и другие варианты.