我有一个包含大量变量的对象,这些变量需要保存在本地以及数据库中。该对象将使用NSKeyedArchiver (与来自https://github.com/nicklockwood/CryptoCoding的CryptoCoder结合使用)进行序列化和本地存储。
现在,我尝试将数据存储在数据库(cloudant.com)中。我可以直接使用NSData发送数据,在数据库中存储(例如,< F60323 04A525 ... 6D3301>),但是读回来我不知道如何将其转换回NSData。将NSString与编码一起使用会产生null结果。
因为序列化的数据被写入一个遵循plist格式的文件中,所以我尝试使用NSPropertyListSerialization将其转换为NSDictionary并将其上传,但转换不准确。
需要建议。
发布于 2013-03-19 01:58:02
NSData (例如,< F60323 04A525...6D3301 >)是十六进制格式。我相信您正在调用[NSData description]方法来获得该结果。它不应该用于序列化,尽管序列化并不是不可能。(只需要编写一个自定义的十六进制数据转换器)
有很多方法可以通过网络传输数据。我假设您正在使用HTTP作为您的传输层。我列出了两种可以做到的方法
JSON方式(也适用于plist,尽管它支持更多的数据类型)
编写自定义序列化程序和反序列化程序,将要序列化的对象转换为NSJSONSerializer可以成功序列化到JSON的对象。
可以转换为JSON的对象必须具有以下属性:
参考资料:
通过HTTP的原始NSData
通过HTTP上传原始数据(从NSCoding)通常是通过应用程序/八位组流或多部分/格式数据的HTTP POST完成的。
如果您想使用其他方法进行POST,如应用程序/x-www-form-urlencoded,则需要将其序列化为web友好编码,如base64或十六进制。我推荐使用Base64。iOS没有附带Base64编码器和解码器,但我已经编写了一个(基于Mattt Thompson的AFNetworking实现)。我知道其他人也写过类似的方法,我已经检查过了,发现Mattt Thompson (以及随后我的base64解码器代码)是干净的,可读的,并且逻辑尽可能少。
Base64 Encoding and Decoding implementation in Objective-C
确保您在从服务器取回数据时,如果数据是(base64或十六进制)编码的,请首先进行解码。将解码后的数据序列化为JSON、属性列表或NSCoding,具体取决于您的实现。
基本上,颠倒您的序列化步骤。
https://stackoverflow.com/questions/15482701
复制相似问题