objective c属性列表和二进制文件的互操作
#import <Foundation/Foundation.h>
void print_dictionary(id t);
int main(const int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSError *error;
NSData *data;
NSArray *objects, *keys, *array;
NSDictionary *dict;
error = nil;
array = [NSArray arrayWithObjects:
@"ABC", [NSNumber numberWithInt: 999], nil];
objects = [NSArray arrayWithObjects:
@"hello world",
[NSNumber numberWithInt: 1],
[NSNumber numberWithFloat: 10.123],
array,
nil
];
keys = [NSArray arrayWithObjects:
[NSNumber numberWithInt: 1],
[NSNumber numberWithInt: 2],
[NSNumber numberWithInt: 3],
[NSNumber numberWithInt: 4],
nil
];
dict = [NSDictionary dictionaryWithObjects: objects forKeys: keys];
print_dictionary(dict);
data = [NSPropertyListSerialization dataWithPropertyList: dict
format: NSPropertyListBinaryFormat_v1_0
options: NSPropertyListBinaryFormat_v1_0
error: &error];
[data writeToFile: @"a.bin" atomically: TRUE];
print_dictionary(dict);
NSDictionary *dict1;
NSData *data1;
NSPropertyListFormat format;
error = nil;
format = NSPropertyListBinaryFormat_v1_0;
data1 = [NSData dataWithContentsOfFile: @"a.bin"];
dict1 = [NSPropertyListSerialization propertyListWithData: data1
options: NSPropertyListBinaryFormat_v1_0
format: &format
error: &error];
print_dictionary(dict1);
NSMutableDictionary *dict2;
NSData *data2;
NSString *errorDesc;
format = NSPropertyListBinaryFormat_v1_0;
error = nil;
data2 = [NSData dataWithContentsOfFile: @"a.bin"];
dict2 = [NSPropertyListSerialization propertyListFromData: data2
mutabilityOption: NSPropertyListMutableContainers
format: &format
errorDescription: &errorDesc];
print_dictionary(dict2);
[dict2 setObject: @"good" forKey: [NSNumber numberWithInt: 5]];
print_dictionary(dict2);
[pool drain];
return 0;
}
void print_dictionary(id t)
{
id object, key;
for (key in [t keyEnumerator])
{
object = [t objectForKey: key];
NSLog(@"key=%@ object=%@", key, object);
}
}
属性列表中出现[NSNull null]的成员时候会有问题,不能序列化和反序列化。
以下是windows下的输出结果:
C:\GNUstep\msys\1.0\home\pro\cpro>cpro.exe
2015-02-04 15:25:59.425 cpro[2988] key=1 object=hello world
2015-02-04 15:25:59.440 cpro[2988] key=2 object=1
2015-02-04 15:25:59.440 cpro[2988] key=3 object=10.123
2015-02-04 15:25:59.440 cpro[2988] key=4 object=(ABC, 999)
2015-02-04 15:25:59.440 cpro[2988] key=1 object=hello world
2015-02-04 15:25:59.440 cpro[2988] key=2 object=1
2015-02-04 15:25:59.440 cpro[2988] key=3 object=10.123
2015-02-04 15:25:59.440 cpro[2988] key=4 object=(ABC, 999)
2015-02-04 15:25:59.440 cpro[2988] key=1 object=hello world
2015-02-04 15:25:59.440 cpro[2988] key=2 object=1
2015-02-04 15:25:59.440 cpro[2988] key=3 object=10.123
2015-02-04 15:25:59.440 cpro[2988] key=4 object=(ABC, 999)
2015-02-04 15:25:59.440 cpro[2988] key=1 object=hello world
2015-02-04 15:25:59.440 cpro[2988] key=2 object=1
2015-02-04 15:25:59.440 cpro[2988] key=3 object=10.123
2015-02-04 15:25:59.440 cpro[2988] key=4 object=(ABC, 999)
2015-02-04 15:25:59.440 cpro[2988] key=5 object=good 5已经被添加了,但是dictionary是无序的
2015-02-04 15:25:59.440 cpro[2988] key=1 object=hello world
2015-02-04 15:25:59.440 cpro[2988] key=2 object=1
2015-02-04 15:25:59.440 cpro[2988] key=3 object=10.123
2015-02-04 15:25:59.440 cpro[2988] key=4 object=(ABC, 999)