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

Oop 什么是对象序列化和反序列化?,oop,serialization,Oop,Serialization,什么是对象序列化和反序列化 序列化与普通技术有什么区别,比如读取对象的属性,然后用它们填充数据行的列,最后将数据行保存在DB中?序列化通常是将运行时对象的状态写入磁盘的过程(但它可以在任何地方),并且能够重新阅读 实际上,将对象的属性存储到表中是一种序列化形式 在.NET中,还有其他形式: XML序列化 二进制序列化 你可以自己做 但一般来说,如果您将对象的状态保存在某个位置,然后在运行时将其重新读回“活动”对象,则您将对其进行序列化。序列化通常指创建可用于存储(可能在文件中)的数据(而不是

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


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

序列化通常是将运行时对象的状态写入磁盘的过程(但它可以在任何地方),并且能够重新阅读

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

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

  • XML序列化
  • 二进制序列化
你可以自己做


但一般来说,如果您将对象的状态保存在某个位置,然后在运行时将其重新读回“活动”对象,则您将对其进行序列化。

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

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

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


大多数平台都有一系列序列化工具。例如,听起来像是在谈论.NET—所以
BinaryFormatter
(.NET特定)、
XmlSerializer
DataContractSerializer
、Json.NET和protobuf-NET/dotnet-protobufs都符合条件。

序列化=将对象的相关状态转换为可流化的表示。这可能意味着将其转换为字节流。这不一定包括将每个成员变量复制到流中。Joshua Bloch在有效Java中使用的经典示例是哈希集。您只需序列化哈希集中的元素,而不是键


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

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

a) 转移更容易

b) 存储和恢复它更容易

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

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


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

序列化

序列化是将一个对象或一组对象图形转换为流的过程

反序列化

反序列化是将流转换回一个对象或一组对象图的过程

以下是一些自定义属性的示例:

[OnDeserialization]->当我们需要在流的反序列化过程中执行某些操作时,使用它。 [OnDeserialized]->将流反序列化为对象后需要执行某些操作时,可以使用它。例如正确设置对象的字段值

以下是示例

[可序列化]
内部类DemoForSerializableAndDeserializable
{
内部字符串Fname=string.Empty;
内部字符串Lname=string.Empty;
内部流序列化对象(DemoForSerializableAndDeserializable objDemo)
{
DemoForSerializableAndDeserializable objSer=新的DemoForSerializableAndDeserializable();
MemoryStream ms=新的MemoryStream();
BinaryFormatter bf=新的BinaryFormatter();
序列化(ms,objSer);
返回ms;
}
[正在序列化]
私有序列化(StreamingContext上下文)
{
//在反序列化流时执行一些工作
}
[已序列化]
私有void OnSerialized(StreamingContext上下文)
{
Fname=“abc”;
}
}
呼叫代码

类调用代码
{
string fname=string.Empty;
string Lname=string.Empty;
静态void Main(字符串[]参数)
{
DemoForSerializableAndDeserializable demo=新的DemoForSerializableAndDeserializable();
Stream ms=demo.SerializeToMS(demo);
ms.Position=0;
DemoForSerializableAndDeserializable demo1=新的BinaryFormatter()。反序列化(ms)为DemoForSerializableAndDeserializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}  
}

序列化并不一定意味着将其写入磁盘。这只意味着将其转换成可以导出的二进制格式。例如,序列化对象可能通过网络发送,而不是写入磁盘。是的,这就是我在底部写“某处”的原因。我只是在第一句中漏掉了一个“一般”。你是