我有一个对象,其中包含大量需要在本地以及数据库中保存的变量。该对象将使用NSKeyedArchiver进行本地序列化和存储(与https://github.com/nicklockwood/CryptoCoding中的CryptoCoder结合使用)。
现在我正在尝试将数据存储在db(cloudant.com)中。我可以直接使用NSData发送数据,在数据库中存储(例如,< F60323 04A525 ...... 6D3301>)但是读回来我不知道如何将其转换回NSData。将NSString与编码一起使用会产生空结果。
因为序列化数据是在一个遵循plist格式的文件中写的,所以我尝试使用NSPropertyListSerialization将其转换为NSDictionary并改为发送,但转换不准确。
需要建议。
答案 0 :(得分:1)
NSData(例如,< F60323 04A525 ...... 6D3301>)是十六进制格式。我相信你正在调用[NSData description]
方法来获得结果。虽然序列化并非不可能,但它不能用于序列化。 (只需要为数据转换器编写自定义十六进制)
通过网络传输数据的方法很多。我假设您使用HTTP作为传输层。我列出了两种方法可以做到这一点
编写自定义序列化程序和反序列化程序,将要序列化的对象转换为NSJSONSerializer可以成功序列化为JSON的对象。
可以转换为JSON的对象必须具有以下属性:
参考:
通过HTTP上传原始NSData(来自NSCoding)通常使用application / octet-stream的HTTP POST或multipart / form-data来完成。
如果您想使用application / x-www-form-urlencoded等其他方法进行POST,则需要将其序列化为web友好编码,如base64或hexadecimal。我建议使用Base64。 iOS没有Base64编码器和解码器,但我写了一个(基于Mattt Thompson的AFNetworking实现)。我知道其他人已经编写了类似的方法,我已经审查并发现Mattt Thompson(以及随后我的派生base64解码器代码)干净,可读且逻辑尽可能少。
Base64 Encoding and Decoding implementation in Objective-C
确保从服务器检索数据时,如果是(base64或hex)编码,则先解码。将解码数据序列化为JSON,属性列表或NSCoding,具体取决于您的实现。
基本上,反转序列化步骤。