응용 프로그램의 버전 1.0에는 모든 모델 클래스가 NSCoding 프로토콜을 준수하므로 NSKeyed (Un) Archiver 클래스를 사용하여 저장 /로드되는 데이터 모델이 있습니다. 다음 계층이 존재하는 말 :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];
어떤 아이디어?
일종의 작품! 하나의 문제는 "Houses"배열이 다른 객체와 함께 NSArray에 래핑 된 것입니다. 이렇게하면 [NSKeyedArchiver archivedDataWithRootObject : (NSArray *) topLevelArray]를 호출하여 하나의 객체를 쉽게 직렬화 할 수 있습니다. 이 문제를 해결하려면 [NSKeyedUnarchiver unarchiveObjectWithData : topLevelArrayData];를 사용하고있었습니다. unarchiveObjectWithData : 메서드는 클래스 메서드이므로 사용자 정의 NSKeyedUnarchiver 인스턴스와 함께 사용할 수 있습니까? –
안녕하세요 크레이그! NSKeyedUnarchiver 클래스는 클래스 및 인스턴스 수준에서 setClass : forClassName : 함수를 제공하므로 실제로 [NSKeyedUnarchiver setClass : forClassName :]이라고 말한 다음 [NSKeyedUnarchiver unarchiveObjectWithData : topLevelArrayData]를 사용할 수 있습니다. 원하는 경우 NSKeyedUnarchiver의 인스턴스를 만들 수 있지만 필수는 아닙니다. 그것은 당신이 전에 어느쪽으로 든 제공 한 설정을 사용해야합니다. –