2009-06-23 2 views
0

응용 프로그램의 버전 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]; 

어떤 아이디어?

답변

1

여기에있는 속임수는 NSKeyedUnarchiver에서 제공하는 setClass : forClassName : 함수를 사용하는 것입니다. 그것은 당신이 말할 수 있습니다 : "수업 클래스의 모든 인스턴스를 deserialize 클래스 TownHouse를 사용하십시오."

그런 다음 TownHouse의 initWithCoder : 함수를 수정하여 두 계층 중 하나를 디코딩해야합니다. decodeObject 또는 decodeObjectForKey :를 호출 한 다음 isKindOfClass :를 사용하여이 유형을 처리 할 수 ​​있습니다. containsValueForKey :를 사용하여 특정 키를 읽기 전에 이들 키를 검사 할 수도 있습니다.

도움이 되었기를 바랍니다.

+0

일종의 작품! 하나의 문제는 "Houses"배열이 다른 객체와 함께 NSArray에 래핑 된 것입니다. 이렇게하면 [NSKeyedArchiver archivedDataWithRootObject : (NSArray *) topLevelArray]를 호출하여 하나의 객체를 쉽게 직렬화 할 수 있습니다. 이 문제를 해결하려면 [NSKeyedUnarchiver unarchiveObjectWithData : topLevelArrayData];를 사용하고있었습니다. unarchiveObjectWithData : 메서드는 클래스 메서드이므로 사용자 정의 NSKeyedUnarchiver 인스턴스와 함께 사용할 수 있습니까? –

+0

안녕하세요 크레이그! NSKeyedUnarchiver 클래스는 클래스 및 인스턴스 수준에서 setClass : forClassName : 함수를 제공하므로 실제로 [NSKeyedUnarchiver setClass : forClassName :]이라고 말한 다음 [NSKeyedUnarchiver unarchiveObjectWithData : topLevelArrayData]를 사용할 수 있습니다. 원하는 경우 NSKeyedUnarchiver의 인스턴스를 만들 수 있지만 필수는 아닙니다. 그것은 당신이 전에 어느쪽으로 든 제공 한 설정을 사용해야합니다. –

관련 문제