什么是对象序列化和反序列化?

odi*_*seh 14 oop serialization

什么是对象序列化序列化

序列化与常规技术有什么区别,比如读取对象的属性,然后用它们填充DataRow的列,最后在数据库中保存DataRow?

Mar*_*ell 22

序列化通常是指创建可用于存储(可能在文件中),通过网络传输的数据(而不是对象)的版本,或者可能仅用于AppDomain在单个机器上的进程/ s/etc 之间进行传输.

序列化通常意味着将数据写为字符串(想想:xml/json)或原始二进制(byte[]等等).反序列化是一个相反的过程; 获取原始数据(来自文件,来自传入的网络套接字等)并重建对象模型.

使用db之间的区别在于它没有内在的表格布局,也没有与数据库的真正联系; 数据可以是任何形状,并且倾向于更紧密地映射到面向对象的布局而不是表格的行/列性质.

大多数平台都有一系列序列化工具.例如,它听起来就像你在谈论.NET -所以BinaryFormatter(.NET专用), XmlSerializer,DataContractSerializer,Json.NET和protobuf网/ DOTNET-protobufs将所有符合条件.

  • @Vikash 你曾经需要*存储*数据吗?在文件系统上还是作为数据库中的原始 clob/blob 字段?或者在同一台机器上的进程之间交换它?甚至可能通过网络(本地或互联网)将数据发送到另一台机器上的进程?所有这些事情都需要序列化。本地进程空间中的对象只能由该机器上的该进程在该进程的有限生命周期内访问。 (4认同)

jen*_*ens 6

序列化=将对象的相关状态置于可流式表示中.这可能意味着将其转换为字节流.这不一定包括将每个成员变量复制到流中.Joshua Bloch在Effective Java中使用的经典示例是HashSet.您只需序列化Hashset中的元素,但不能序列化键.

反序列化=从串行表示中恢复对象并确保对象的不变量.反序列化可以被认为是对象的单独构造函数.对于上面提到的HashSet,您将创建一个新的HashSet,然后将流中的值插入到这个新的数据结构中.


Daf*_*aff 5

序列化意味着,您将对象持久化为可以存储在某处的表示形式。一种方法是将指针指向对象在内存中的存储位置,并将每个字节按原样写入文件。由于该表示非常特定于您的编程语言(以及它如何表示内存中的对象),因此改进方法是将您的对象转换为具有某种众所周知的结构(如 XML 或 JSON)的字符串表示,以便您能够

a) 转移更容易

b) 更容易存储和恢复

c) 由于每个人都知道格式是如何定义的,任何其他程序也可以读取您的对象

因此,将对象放入数据库也只是另一种序列化形式。

反序列化意味着,您可以从保存该对象的位置再次加载/恢复该对象。


Noo*_*ilk 1

一般来说,序列化是将运行时中对象的状态写入磁盘(但可以在任何地方)并能够再次读回的过程。

实际上,将对象的属性存储到表中是序列化的一种形式。

在.NET中,还有其他形式:

  • Xml序列化
  • 二进制序列化

你可以自己制作。

但一般来说,如果您将对象的状态保存在某处,然后将其再次读回到运行时的“活动”对象中,则您正在将其序列化。

  • 序列化并不一定意味着将其写入磁盘。它只是意味着将其转换成某种可以导出的二进制格式。例如,序列化对象可能通过网络发送,而不是写入磁盘。 (2认同)