我正在使用URLScheme,我需要将应用程序A中的序列化NSDictionary发送到我的应用程序B.
在 app A 中,我使用NSKeyedArchiver将我的NSDictionary序列化为NSData
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"This is value 1", @"key1",
@"value 2", @"key2",
@"value3", @"key3",
@"", @"key4",
@"value5", @"key5",
@"value 6", @"key6",
nil];
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:myDictionary];
[archiver finishEncoding];
[archiver release];
NSString *bytes = [[[NSString alloc] initWithData:data
encoding:NSASCIIStringEncoding] autorelease];
在应用B 中,我正在使用NSKeyedUnarchiver
NSData *data = [[NSString stringWithFormat:@"%@", val] dataUsingEncoding:NSASCIIStringEncoding];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *myDictionary = [[unarchiver decodeObject] retain];
[unarchiver finishDecoding];
[unarchiver release];
我的序列化NSDictionary看起来像:
bplist00Ô01T$ $ topX $ objectsX $ versionYarchiverÑR$ 0
!“#$%&'()U $nullÓZNS.objectsWNS.keysV$ class |
| Tkey2Tkey5Tkey3Tkey1Tkey6Tkey4Wvalue 2o @
看起来我无法将此NSString转换为NSData并重新获取我的NSDictionary。
在[dataUsingEncoding:dataUsingEncoding:NSASCIIStringEncoding]之后,NSData为NULL。
答案 0 :(得分:5)
查看NSJSONSerialization,使字典和数组成为json plain字符串格式变得轻而易举。
生成json数据 NSDictionary * mydict = [NSDictionary dictionaryWithObjectsAndKeys:....
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info options:NSJSONWritingPrettyPrinted error:&error];
然后改回来:
NSError *error = nil;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
没有那么简单,你不需要任何外部库或设置。内置于
答案 1 :(得分:2)
为什么你要将字节作为NSString
发送 - 这永远不会起作用!
(a)NSString
用于编码的文本数据 - 即遵循一组特定规则的数据。
(b)NSData
用于一系列只是字节的字节。
你有(b),而不是(a)。
发送NSData
个对象,根本不转换为NSString
。
编辑URL参数怎么样?
好的,所以我上面的答案有点太黑了。
如果确实需要在数据和字符串之间进行转换,请查看base64编码 - 它将以大小为代价为您提供数据的安全字符串表示。
这里有一些图书馆可以为你转换 - 试试这个:https://github.com/nicklockwood/Base64
然而,如果您在iOS6设备上对字典进行编码并在iOS5上对其进行解码会发生什么 - 您无法100%肯定会起作用。您可能最好编写自己的编码/解码方法,将字典转换为字符串然后再返回。如果是网址,为什么不使用网址参数,例如x=5&name=Bob
?