2010-01-08 10 views
4

applicationWillTerminate에 저장을 구현했으며 applicationWillFinishLoading에로드했습니다. 완전한 개체 트리가 있으며 모두 NSCoding 프로토콜을 구현하며 입력 한 유형을 확인했습니다.보관/보관 결과를 initForReadingWithData로 저장합니다. 이해할 수없는 보관 파일

클래스 중 하나는 NSMutableData에서 NSKeyedArchive까지도 저장하며, 때때로 보관 취소 될 수도 있습니다. 이상하게도 때로는 작동하고 때로는 그렇지 않습니다. NSMutableData의 일부 콘텐츠가 보관 처리를 중단 할 것으로 판단됩니다.

나는 bools을 제외한 모든 개체에 대한 encodeObject를 사용하고 내가

더 명확하게하기 위해 올바른 대응 방법 (encodeBool:forKey:encodeInt:forKey:)를 사용하는 경우 int로는 : 코드는 정말 가끔 작업을 수행 그것을 다시 할 수 있습니다 오히려 완전한 개체 그래프 일뿐입니다.

내가 오류 메시지는 다음과 같습니다

initForReadingWithData incomprehensible archive 0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30 

추가 : 코드 실패하는, 그것에게 NSMutableData

- (void)encodeWithCoder:(NSCoder*)encoder { 
[encoder encodeObject:self.encodedMessage forKey:@"EncodedMessage"]; //NSData 
[encoder encodeObject:self.data forKey:@"Data"]; //NSMutableData (10+MB) 
[encoder encodeObject:self.header forKey:@"Header"]; //NSString 
[encoder encodeObject:self.fileName forKey:@"FileName"]; //NSString 
[encoder encodeInt:self.dataStartIndex forKey:@"DataStartIndex"]; //int 
[encoder encodeInt:self.dataEndIndex forKey:@"DataEndIndex"]; //int 
} 

- (id)initWithCoder:(NSCoder*)decoder { 
    if (self = [super init]) { 
     self.encodedMessage = [decoder decodeObjectForKey:@"EncodedMessage"]; //NSData 
     self.data = [decoder decodeObjectForKey:@"Data"]; //NSMutableData 
     self.header = [decoder decodeObjectForKey:@"Header"]; //NSString 
     self.fileName = [decoder decodeObjectForKey:@"FileName"]; //NSString 
     self.dataStartIndex = [decoder decodeIntForKey:@"DataStartIndex"]; //int 
     self.dataEndIndex = [decoder decodeIntForKey:@"DataEndIndex"]; //int 
    } 

    return self; 
} 

메가바이트 10 +의 것은 내가 self.data 인코딩을 제거하고 디코딩 할 때 항상 작동하는 것처럼 보입니다. 작은 크기의 self.data에서도 실패합니다. 크기가 문제가 아닌 콘텐츠 문제가 있습니까? 나는 그것에 nsmutabledata 쓰기했을 때

파일을 열 시도의 propertly 목록 편집기 오류를 표시합니다

"Conversion of string failed. The string is empty." 

plutil는이 오류주는 다음 부울 들어

"$ plutil -lint nzbvortex.state nzbvortex.state: Conversion of string failed. The string is empty." 
+0

이 문제가 발생했습니다. 오류 메시지는 귀하의 것과 동일합니다. 다른 스레드에서 NSKeyedArchiver에 의해 아카이브 된 데이터를 unarchive하기 위해 NSFileCoordinator 읽기 블록에서 NSKeyedUnarchiver를 사용합니다. 충돌이 때때로 발생하고 디버깅 할 때 충돌을 재현 할 수 없습니다. 해결책있어? – liuyaodong

답변

2

NSMutableArray를 통해 약 230000 바이트를 초과하는 저장소는 NSKeyedArchiver가 깨진 plist 파일을 생성하게합니다.

220000 작품, 250000하지 않았다. 허용되는 정확한 금액을 검색 했습니까?

+0

바이너리 plist가 발생하기 때문입니다. –

0

및 int 인 경우 encodeBool:forKey:encodeInt:forKey:의 두 가지 방법이 있습니다 (NSKeyedArchiver reference에서 가져옴).

NSMutableData의 경우 encodeObjectForKey:으로 보관하고 decodeObjectForKey:으로 보관 취소해야합니다.

자세한 내용은 useful guide을 참조하십시오.

+0

그것이 바로 내가하는 일입니다. 코드가 작동하지만 항상 그런 것은 아닙니다. 특정 내용이 인코딩을 깨뜨리는 것처럼 보입니다. –

+0

XML 속성 목록 형식을 사용하고 있습니까? 그렇다면 PList 편집기 (Developer Tools에서)로 아카이브를 열려고 했습니까? –

+0

NSKeyedArchiver를 사용할 때 nsmutabledata에 저장 될 바이트의 양에는 제한이있는 것으로 보입니다. 문제가 해결되었습니다 (실제로 우회 됨). 도와 줘서 고맙다. –

4

FWIW 나는 또한이 문제를 우연히 만났으며 여기에 내가 찾은 것이있다.

0x62, 0x70, 0x6c 등이보고 된 바이트는 NSKeyedArchiver가 기본적으로 사용하는 이진 속성 목록의 시작 부분에있는 "bplist"마법 문자열의 일부입니다.

이진 속성 목록은 메타 데이터를 예고편 (예 : 데이터 끝)에 저장합니다. 그래서 만약 잘려나 간다면 전체 plist를 읽을 수 없게됩니다.

그게 무슨 일이 일어 났는지 확인하려면 Cocotron (http://code.google.com/p/cocotron/source/browse/Foundation/NSPropertyList/)의 NSPropertyListReader_binary1을 사용하여 파일 형식의 작동 방식을 확인할 수 있습니다.

희망이 있으면 도움이됩니다.

+0

당신이 말했듯이, 저를위한 정확한 오류는 진부한 데이터였습니다. 귀하의 답변은 올바르게 표시되어야합니다. 감사. –

관련 문제