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 或 multipart/form-data 的 HTTP POST 完成。
如果您想使用 application/x-www-form-urlencoded 等其他方法进行 POST,则需要将其序列化为 web 友好编码,如 base64 或十六进制。我推荐使用 Base64。iOS 不附带 Base64 编码器和解码器,但我编写了一个(基于 Mattt Thompson 的 AFNetworking 实现)。我知道其他人写过类似的方法,我审查并发现 Mattt Thompson(以及随后我派生的 base64 解码器代码)是干净的、可读的和尽可能少的逻辑。
Objective-C 中的 Base64 编码和解码实现
确保从服务器检索数据时,如果它是(base64 或十六进制)编码的,请先解码。将解码后的数据序列化为 JSON、Property List 或 NSCoding,具体取决于您的实现。
基本上,反转您的序列化步骤。