Ios 将NSDictionary序列化为NSString

Ios 将NSDictionary序列化为NSString,ios,serialization,nsdictionary,nsdata,Ios,Serialization,Nsdictionary,Nsdata,我正在使用URLScheme,我需要将序列化的NSDictionary从我的应用程序A发送到我的应用程序B 在应用程序A中,我使用NSKeyedArchiver将我的NSDictionary序列化为NSData NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"This is value 1", @"key1", @"

我正在使用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△
阿尔TKEY2TKEY5TKEY3TKEY1TKEY4W2O值@

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


NSData在[DataUsingEncode:DataUsingEncode:NSASCIIStringEncoding]之后为空。

你究竟为什么要以
NSString
的形式发送字节呢?那是行不通的

(a)
NSString
用于编码文本数据,即遵循特定规则集的数据

(b)
NSData
用于一系列仅为字节的字节

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

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


编辑URL参数呢

好的,我上面的答案有点太黑太白了

如果您真的需要在数据和字符串之间进行转换,请看一下base64编码——它将为您的数据提供一种安全的字符串表示形式,而不会影响数据的大小

这里有几个库可以为您进行转换-试试这个:


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

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

生成json数据 NSDictionary*mydict=[NSDictionary Dictionary WithObjectsAndKeys:

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info options:NSJSONWritingPrettyPrinted error:&error];
把这个换回来:

NSError *error = nil;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

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

你能解释一下我如何将NSData发送到NSURL中,以启动和检索从应用程序a到应用程序B的参数吗?谢谢我正在使用URLScheme,这就是为什么我需要将我的NSDictionary作为NSSTRING发送的原因实际上,我已经尝试了将我的NSDictionary作为get参数进行匹配,它就起作用了。但我想管理更复杂的NSDictionary,这就是为什么我试图找出如何将NSDictionary序列化为NSString;)我将尝试您的Base64编码解决方案。感谢您为什么不在NSDictionary的类别中编写一个方法,将任何字典转换为get参数字符串-那么您呢r字典的复杂性无关紧要:)当你完成时,你可以随时打开它的源代码…;)只要试过就行了。非常感谢!所以你认为根据iOS版本有一些可能的解决方法可以管理吗?感谢这个解决方案,如果iOS目标低于5.xYes,也许JSONKit可以作为一个替代方案。我使用SBJSON。工作起来就像一个字符mOnly JSON是地球上最丑陋的表示形式。体积大、效率低、速度慢……Mac上还有另一种文本表示形式,更可取的是.plist XML,当您使用[dict saveToFile:]或[dict savetour:withError]或更高版本时,它也是NSDictionary的本机持久性格式[NSDictionary Dictionary WithContentsOfFile:]等。