4月10th

序列化和反序列化讲解

DIY编程技术我来说两句!

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件中“恢复”对象到序列化之前的状态。 


序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。
比如,一个计数器,数值为2,我们可以用字符串“2”表示。
如果有个对象,叫做connter,当前值为2,那么可以序列化成“2”,反向的,也可以从“2”得到值为2的计数器实例。
这样,关机时序列化它,开机时反序列化它,每次开机都是延续的。不会都是从头开始。

序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。

序列化有很多好处,比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。
这个例子是目前比较先进的“智能代理”的原理。

当前比较热火的web services使用soap协议,soap协议也是以对象的可序列化为基础的。

 

using System.Runtime.Serialization.Formatters.Binary;
public class SerializationUnit
{        
    /// <summary>
    /// 把对象序列化为字节数组
    /// </summary>
    public static byte[] SerializeObject(object obj)
    {
        if (obj == null)
            return null;
        MemoryStream ms = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(ms, obj);
        ms.Position = 0;
        byte[] bytes = new byte[ms.Length];
        ms.Read(bytes, 0, bytes.Length);
        ms.Close();
        return bytes;
    }

    /// <summary>
    /// 把字节数组反序列化成对象
    /// </summary>
    public static object DeserializeObject(byte[] bytes)
    {
        object obj = null;
        if (bytes == null)
            return obj;
        MemoryStream ms = new MemoryStream(bytes);
        ms.Position = 0;
        BinaryFormatter formatter = new BinaryFormatter();
        obj = formatter.Deserialize(ms);
        ms.Close();
        return obj;
    }
}

本文出自:DIY博客园,链接:https://www.diybloghome.com/prology/208.html,转载请注明!