NSDictionary序列化为NSString

时间:2012-10-15 13:52:46

标签: ios serialization nsdictionary nsdata

我正在使用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。

2 个答案:

答案 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