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

时间:2009-09-01 05:11:52

标签: oop serialization

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

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

5 个答案:

答案 0 :(得分:19)

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

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

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

大多数平台都有一系列序列化工具。例如,听起来你在谈论.NET - 所以byte[](特定于.NET),BinaryFormatterXmlSerializer,Json.NET和protobuf-net / dotnet-protobufs都符合条件。

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

a)更容易转移

b)存储和恢复更容易

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

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

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

答案 3 :(得分:1)

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

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

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

  • XmlSerialization
  • BinarySerialization

你可以自己做。

但一般来说,如果你在某个地方保存对象的状态,然后再将它再次读回运行时的“实时”对象,那么就是在序列化它。

答案 4 :(得分:0)

<强>序列化

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

<强>反序列化

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

以下是一些自定义属性:

[OnDeserialization] - &gt;当我们需要在流的反序列化期间执行某些操作时使用它。 [OnDeserialized] - &gt;在将流反序列化为对象后,我们需要执行某些操作时使用它。例如正确设置对象的字段值

以下是示例

 [Serializable]
    internal class DemoForSerializableAndDeserializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializableAndDeserializable objDemo)
        {
            DemoForSerializableAndDeserializable objSer = new DemoForSerializableAndDeserializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnDeserializing]
        private void OnDeserializing(StreamingContext context)
        {
            // Do some work while deserializing the stream
        }
        [OnDeserialized]
        private void OnSerialized(StreamingContext context)
        {
            Fname = "abc";
        }

    }

致电代码

class CallingCode
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializableAndDeserializable demo = new DemoForSerializableAndDeserializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializableAndDeserializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializableAndDeserializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }