Версия 1.0 приложения имеет модель данных, которая сохраняется/загружается с использованием классов архива NSKeyed (Un), поскольку все классы моделей придерживаются протокола NSCoding. Скажем, следующая иерархия существует:Программная загрузка объектной модели, созданной с использованием NSCoding
-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)
сказать, что есть устаревшие файлы, сохраненные таким способом, но должны быть загружены в версии 2.0 приложения для обратной совместимости, используя следующую более новую модель данных:
-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)
Очевидно, что некоторые данные будут отсутствовать и их необходимо будет заполнить. для каждого из «числа жителей», который существовал раньше, должен быть создан базовый объект «Оккупант». То, что я ищу, - это способ программной загрузки в предыдущей модели данных, особенно если у меня есть только список классов/иерархии, а не самих файлов .m/.h.
Так что я хочу сделать, это (предполагая, что у меня есть файл Houses.data, который был сериализован используя массив домов):
NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];
Любые идеи?
Это вид работ! Одна из проблем заключается в том, что массив «Дома» вместе с несколькими другими объектами был завернут в NSArray. Это упростило сериализацию одного объекта, вызвав [NSKeyedArchiver archivedDataWithRootObject: (NSArray *) topLevelArray]; Чтобы получить это обратно, я использовал [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData] ;. Так как я могу использовать метод unarchiveObjectWithData:, так как это метод класса с экземпляром пользовательского NSKeyedUnarchiver? –
Эй, Крейг! Класс NSKeyedUnarchiver предоставляет функцию setClass: forClassName: как на уровне класса, так и на уровне экземпляра, поэтому вы можете сказать [NSKeyedUnarchiver setClass: forClassName:], а затем использовать [NSKeyedUnarchiver unarchiveObjectWithData: topLevelArrayData]. Вы можете создать экземпляр NSKeyedUnarchiver, если хотите, но это не требуется. Он должен использовать настройки, которые вы предоставили перед рукой в любом случае. –