Plist를 이진 PLIST로 변환합니다
-
06-07-2019 - |
문제
Apple은 큰 XML 기반 데이터 세트를 iPhone 앱에 읽을 때 Binary Plist 형식을 사용하는 것이 좋습니다. 그들의 추론 중에는 XML 파싱이 iPhone에 대해 매우 세금을 부과하고 있다는 사실이 있습니다. 그러나 원격 웹 서버에 상주하는 파일을 먼저 변환해야합니다.
자주 변화하는 콘텐츠의 경우 수동으로 수행하는 것이 허용되지 않습니다. 가능하다면 웹 기반 앱이 명령 줄을 호출하여 변환 (예 : Plutil)을 수행하지 않으려 고합니다.
이 변환을 수행하기 위해 공개적으로 사용할 수있는 알고리즘이 있습니까?
해결책
예. 모든 PLIST 코드는 CoreFoundation의 일부이며 OpenSource입니다. CoreFoundation은 Linux 및 Windows에서 직접 빌드 및 실행할 수 있으므로 Mac OS X에서 사용할 일반 API를 사용하여 CF 도구를 작성할 수 있지만 다른 플랫폼에서 빌드하여 실행할 수 있습니다.
보고 싶은 특정 API는 cfpropertyListWriteToStream (). CoreFoundation 코드는 제공됩니다 사과 (타르 볼)), 다른 곳에서.
마지막으로 파일을 얼마나 자주 업데이트하는지, 서버에서 절약 해야하는 프로세서의 양 및 데이터가 얼마나 반복되는지에 따라 데이터가 남아있을 수 있습니다. 기본적으로 바이너리 plist의 특정 요소는 고유합니다 (예 : 문자열). 다른 요소는 (예 : 배열 및 사전)가 아닙니다. 이진 plist 형식을 사용하면 고유 한 형식을 사용할 수 있습니다. 문제는 실제로 걸어가는 것이 비용이 많이 들고 독특한 배열과 사전은 비싸다는 것입니다. 콘텐츠에 동일한 배열이나 딕트가 많으면 고유 한 크기가 크기가 크게 줄어 듭니다. _flattenplist ()를 해킹하여 cfbinaryplist.c.
그렇게하면 매우 철저히 테스트하고 파일에서는 네트워크를 통해 업데이트 할 수없는 파일을 수행하지 않으면 향후 릴리스가이를 깨뜨리는 최적화를하는 경우를 대비하여 네트워크를 통해 업데이트 할 수 없습니다. 또한 순간 통지에 꺼질 준비가되어 있는지 확인하십시오.
다른 팁
PHP 및 Ruby 구현이 있습니다.
링크 된 루비 구현은 루비 1.9입니다. 루비 1.8에서 작동하는 빠른 바이너리 세리어 라이저를 제압했습니다.
iPhone 또는 서버에서 변환을하고 싶을 지 확실하지 않습니다. 서버에 있고 코코아 프레임 워크를 사용할 수있는 경우 NSPropertyListSerialization
OS X (10.2 이후)에서 지원되는 유형 (문자열, XML 및 이진)을 변환 할 수있는 서비스를 제공합니다. 대신 사용하려면 Core Foundation 라이브러리에 유사한 방법이 있습니다.
XML plist를 이진을 변환하려면 :
NSString *xmlPlistPath; // already set
NSString *outPath; // already set
NSData *plistData;
NSString *error;
NSPropertyListFormat format;
id plist;
plistData = [NSData dataWithContentsOfFile:xmlPlistPath];
plist = [NSPropertyListSerialization propertyListFromData:plistData
mutabilityOption:NSPropertyListImmutable
format:&format
errorDescription:&error];
if(plist == nil) { // unable to parse plist
//deal with failure -- error gives description of the error
} else {
binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&error];
if(binaryPlistData == nil) {//unable to create serialized plist
// deal with failure -- error gives description of the error
}
if(![binaryPlistData writeToFile:outPath atomically:YES]) {
// unable to write file
}
}
보다 속성 목록 공동 가이드 자세한 내용은 Developer.apple.com의 페이지입니다.
명령 줄 도구 Plutil- 속성 목록 유틸리티
Apple은 속성 목록 파일을 망칠 수있는 매우 좋은 명령 줄 도구를 가지고 있습니다.
/usr/libexec/Plistbuddy
- 편집을 위해/usr/bin/plutil
- 구문 검사 및 유형 변환
Plutil Man 페이지 :
Plutil을 사용하여 속성 목록 파일의 구문을 확인하거나 한 형식에서 다른 형식에서 다른 파일을 변환하는 데 사용될 수 있습니다. 지정 - 입력 파일이 stdin에서 읽습니다.
기존 PLIST를 XML, 이진 또는 JSON 형식으로 변환
plutil -convert xml1 stops2.plist
plutil -convert binary1 stops2.plist
plutil -convert json stops2.plist
Perl 구현도 호출됩니다데이터 :: plist
그만큼 binary_plist 보석 Rails 컨트롤러를위한 유효한 응답 형식으로 plist를 추가하는 것은 유망한 것처럼 보입니다.
서버 며칠 전 iOS에서 Plist Binary Data를 사용하여 네트워킹에 몇 가지 문제가 발견되었습니다. Gist
내 것은 문제를 간단히 해결하는 것입니다. Swift로 작성된 PLIST 변환기