iOS 文档区分“序列化”和“归档”。这是一个普遍的区别(即,在其他语言中存在)还是特定于 Objective-C?另外,这两者有什么区别?
3 回答
这是一个在某些时候(但不是全部)是另一个的情况。
维基百科对序列化有这样的说法:
“序列化是将数据结构或对象转换为位序列的过程,以便将其存储在文件或内存缓冲区中,或通过网络连接链接传输,以便稍后在同一或另一个计算机环境中“复活” "
因此,归档可能只是序列化,但也可以是序列化和压缩的组合,例如。或者它可能会添加某种标题信息。所以序列化是归档的一种形式,但归档不一定是序列化。
这并不是 iOS 特有的——这些术语到处都是。不过,它们在 iOS 环境中的具体含义可能非常具体。
我实际上是在尝试从 IOS 的角度寻找它们的不同之处。为感兴趣的人添加以下内容:
目的:
归档用于存储对象图。完整的数据模型可以轻松归档和恢复。Nib 文件的工作方式可以作为归档的示例。
序列化用于存储任意层次的对象。
wat plist 文件的工作可以被视为序列化的示例。
差异(来自档案编程指南的摘录):
“档案保留了图中每个对象的身份以及它与图中所有其他对象的所有关系。”
在 rootObject 调用的上下文中编码的每个对象都被跟踪。如果要求编码器对对象进行多次编码,则编码器会编码对第一个编码的引用,而不是再次编码对象。
“序列化只保留对象的值及其在层次结构中的位置。对同一个值对象的多次引用可能会在反序列化时导致多个对象。不保持对象的可变性。”
实现差异:
任何实现 NSCoding 协议的对象都可以被存档,其中只有 NSArray、NSDictionary、NSString、NSDate、NSNumber 和 NSData(以及它们的一些子类)的实例可以被序列化。数组和字典对象的内容也必须只包含这几个类的对象。
何时使用:
属性列表(序列化)应用于主要由字符串和数字组成的数据。当与大块二进制数据一起使用时,它们的效率非常低。
值得归档 plist 对象以外的对象或存储大块数据。
一般来说,序列化涉及将程序数据类型转换为与体系结构无关的字节流。归档是专门的序列化,因为您可以存储类型和其他基于关系的信息,从而使您可以轻松地进行反序列化/解组。所以归档可以被认为是序列化的一个专业化和子集。对于 Objective-C
序列化将 Objective-C 类型与体系结构无关的字节流转换。与归档相比,基本序列化不记录值的数据类型,也不记录它们之间的关系;仅记录值本身。您有责任以正确的顺序反序列化数据。然而,一些便利类确实提供了序列化属性列表的能力,记录它们的结构及其值。
使用 C++ 增强序列化 --
http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/index.html
在这里,我们使用术语“序列化”来表示将任意一组 C++ 数据结构可逆地解构为字节序列。这样的系统可用于在另一个程序上下文中重构等效结构。根据上下文,这可能用于实现对象持久性、远程参数传递或其他工具。在这个系统中,我们使用术语“存档”来指代这个字节流的特定呈现。这可以是二进制数据、文本数据、XML 或由该库的用户创建的其他文件。