0

我正在使用 URLScheme,我需要将序列化的 NSDictionary 从我的应用 A 发送到我的应用 B。

应用程序 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$versionY$archiverÑR$0¯
!"#$%&'()U$nullÓ ZNS.objectsWNS.keysV$class¦
¦Tkey2Tkey5Tkey3Tkey1Tkey6Tkey4Wvalue 2o@

看起来我无法将此 NSString 转换为 NSData 并取回我的 NSDictionary。

NSData 在 [dataUsingEncoding:dataUsingEncoding:NSASCIIStringEncoding] 之后为 NULL。

4

2 回答 2

7

查看 NSJSONSerialization,将字典和数组转换为 json 纯字符串格式变得轻而易举。

生成 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];

没有比这更简单的了,而且您不需要任何外部库或设置。内置

于 2012-10-15T14:27:55.853 回答
3

你到底为什么要发送字节作为NSString- 这永远行不通!

(a)NSString用于编码的文本数据——即遵循一组特定规则的数据。

(b)NSData用于一系列只是字节的字节。

你有(b),而不是(a)。

发送NSData对象并且根本不转换为/从NSString


编辑 URL 参数呢?

好的,所以我上面的回答有点太黑白了。

如果您确实需要在数据和字符串之间进行转换,请查看 base64 编码 - 它会以牺牲大小为代价为您提供数据的安全字符串表示。

这里有一些库可以为您转换 - 试试这个:https ://github.com/nicklockwood/Base64

但是,如果您在 iOS6 设备上对字典进行编码并在 iOS5 上对其进行解码,将会发生什么——您不能 100% 确定它会起作用。您最好编写自己的编码/解码方法,将字典转换为字符串并再次返回。如果是 URL,为什么不直接使用 URL 参数x=5&name=Bob呢?

于 2012-10-15T14:00:02.567 回答