将NSKeyedArchived NSData存储到数据库或从数据库读取NSData

时间:2013-03-18 17:07:46

标签: database nsdictionary nsdata nskeyedarchiver data-serialization

我有一个对象,其中包含大量需要在本地以及数据库中保存的变量。该对象将使用NSKeyedArchiver进行本地序列化和存储(与https://github.com/nicklockwood/CryptoCoding中的CryptoCoder结合使用)。

现在我正在尝试将数据存储在db(cloudant.com)中。我可以直接使用NSData发送数据,在数据库中存储(例如,< F60323 04A525 ...... 6D3301>)但是读回来我不知道如何将其转换回NSData。将NSString与编码一起使用会产生空结果。

因为序列化数据是在一个遵循plist格式的文件中写的,所以我尝试使用NSPropertyListSerialization将其转换为NSDictionary并改为发送,但转换不准确。

需要建议。

1 个答案:

答案 0 :(得分:1)

NSData(例如,< F60323 04A525 ...... 6D3301>)是十六进制格式。我相信你正在调用[NSData description]方法来获得结果。虽然序列化并非不可能,但它不能用于序列化。 (只需要为数据转换器编写自定义十六进制)

通过网络传输数据的方法很多。我假设您使用HTTP作为传输层。我列出了两种方法可以做到这一点

JSON方式(也适用于plist,虽然它支持更多数据类型)

编写自定义序列化程序和反序列化程序,将要序列化的对象转换为NSJSONSerializer可以成功序列化为JSON的对象。

可以转换为JSON的对象必须具有以下属性:

  • 顶级对象是NSArray或NSDictionary。
  • 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
  • 所有字典键都是NSString的实例。
  • 数字不是NaN或无穷大。

参考:

通过HTTP的原始NSData

通过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,具体取决于您的实现。

基本上,反转序列化步骤。