序列化与归档?
Posted
技术标签:
【中文标题】序列化与归档?【英文标题】:Serialization vs. Archiving? 【发布时间】:2011-05-16 09:07:55 【问题描述】:ios 文档区分“序列化”和“归档”。这是一个普遍的区别(即,在其他语言中存在)还是特定于 Objective-C?还有,这两者有什么区别?
【问题讨论】:
@skaffman,我确实不希望这个被标记的 iOS 以便我可以从其他语言中获得一些答案。 它甚至不是特定于 iOS 的。 NSKeyedArchiver 也可以在 Mac OS X 上使用。 【参考方案1】:这是一种情况,有时(但不是全部)一个是另一个。
***对序列化有这样的说法:
“序列化是将数据结构或对象转换为位序列的过程,以便可以将其存储在文件或内存缓冲区中,或通过网络连接链接传输以在以后“复活”相同或另一个计算机环境”
因此,归档可能只是序列化,但也可以是序列化和压缩的结合,例如。或者它可能会添加某种标题信息。所以序列化是归档的一种形式,但归档不一定是序列化。
这并不是针对 iOS 的——这些术语到处都是。不过,它们在 iOS 环境中的具体含义可能非常具体。
【讨论】:
很好的答案 +1。事实上,我把这一切都搞反了。【参考方案2】:一般来说,序列化涉及将您的程序数据类型转换为与体系结构无关的字节流。归档是专门的序列化,因为您可以存储类型和其他基于关系的信息,从而使您可以轻松地进行反序列化/解组。所以归档可以被认为是序列化的一个专业化和子集。对于Objective-C
序列化转换 Objective-C 类型往返 与体系结构无关的字节流。 与归档相比,基本 序列化不记录数据 值的类型也不是 他们之间的关系;只有 值本身被记录。它是 你有责任反序列化 数据以正确的顺序。一些 然而,便利班确实可以 提供序列化的能力 财产清单,记录他们的 结构以及它们的值。
使用 C++ boost 序列化 --
http://www.boost.org/doc/libs/1_45_0/libs/serialization/doc/index.html
在这里,我们使用术语“序列化” 意味着可逆的解构 任意一组 C++ 数据 结构为字节序列。 这样的系统可以用来 重构等效结构 在另一个程序上下文中。取决于 在上下文中,这可能使用 实现对象持久化,远程 参数传递或其他设施。 在这个系统中,我们使用术语 “存档”指的是特定的 这个字节流的渲染。 这可能是一个二进制数据文件, 文本数据、XML 或其他创建的 由该库的用户提供。
【讨论】:
酷 +1。这有助于我分开。我正在等待其他语言的更多示例。【参考方案3】:我实际上是想从 IOS 的角度来寻找它们的不同之处。为感兴趣的人添加以下内容:
用途:归档用于存储对象图。完整的数据模型可以轻松归档和恢复。 Nib 文件的工作方式可以作为归档的示例。
序列化用于存储任意层次的对象。 wat plist 文件的工作可以被视为序列化的示例。
差异(摘自档案编程指南): “存档保留了图中每个对象的身份以及它与图中所有其他对象的所有关系。” 在 rootObject 调用的上下文中编码的每个对象都被跟踪。如果要求编码器对对象进行多次编码,则编码器会编码对第一个编码的引用,而不是再次编码对象。
“序列化只保留对象的值及其在层次结构中的位置。对同一值对象的多次引用可能会在反序列化时导致多个对象。不保持对象的可变性。”
实施差异: 任何实现 NSCoding 协议的对象都可以被存档,其中只有 NSArray、NSDictionary、NSString、NSDate、NSNumber 和 NSData(以及它们的一些子类)的实例可以被序列化。数组和字典对象的内容也必须只包含这几个类的对象。
何时使用: 属性列表(序列化)应该用于主要由字符串和数字组成的数据。当与大块二进制数据一起使用时,它们的效率非常低。 除了 plist 对象或存储大块数据之外,值得归档对象。
【讨论】:
以上是关于序列化与归档?的主要内容,如果未能解决你的问题,请参考以下文章