C#的序列化和反序列化

  • 发布时间:2016年12月14日 10:38
  • 作者:杨仕航
  • 分类标签: C#
  • 阅读(8072)
  • 评论(0)

讲这个序列化和反序列化模拟两个场景,帮助理解一下他们是什么鬼。理解之后,才方便说如何实现。

场景1:游戏存档和读档

当你在玩一个游戏正High的时候,突然有事找你。那你不得不需要存个档,等下次回来再接着玩。

此处的存档操作是把游戏中已经实例化的对象(场景、人物等)以字符串或二进制数组保存到文件中。这个叫序列化;

等读档的时候,再把保存到文件中的数据读取加载程序中,变成对应的对象(场景和人物等)。这个就是反序列化。


场景2:网络数据传递

你和你们公司的同事在用同一款软件。你有个数据包需要丢给你同事。这时丢过去的过程中,就实现了序列化:把你的数据或对象序列化成二进制。

这个数据包再通过网络传递到你同事的电脑上,再解读显示。这个解读过程,实现了反序列化:把你的数据包解析成对应的数据或对象。


看完上面两个模拟的场景,知道序列化和反序列化的含义和作用了吗。总结如下:

序列化:实例化对象 --> 字符串/二进制数组

反序列化:字符串/二进制数组 --> 实例化对象


序列化和反序列化的实现:

1、在你的类或结构上添加[Serializable]标识,表示该类可以序列化

[Serializable]
public class MyClass
{
    //属性
    public string Name {get;set;}
    
    //构造函数
    public MyClass(string name)
    {
        this.Name = name;
    }
}

我们用于测试的类比较简单,就1个字段。


2、序列化和反序列化的实现,很多人习惯单独写一个类来处理。我习惯写到这个类里面:

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
public class MyClass
{
    //属性
    public string Name {get;set;}
    
    //构造函数
    public MyClass(string name)
    {
        this.Name = name;
    }
    
    //序列化成byte数组
    public byte[] Serialize()
    {
        MemoryStream stream = new MemoryStream();
        IFormatter formatter = new BinaryFormatter();
    
        formatter.Serialize(stream, this);
        byte[] serializedData = stream.ToArray();
        stream.Close();
    
        return serializedData;
    }
    
    //序列化成字符串
    public string SerializeString()
    {
        return Convert.ToBase64String(this.Serialize());
    }
    
    //反序列化
    public static MyClass Deserialize(byte[] data)
    {
        using (MemoryStream stream = new MemoryStream(data))
        {
            IFormatter formatter = new BinaryFormatter();
            return (MyClass)formatter.Deserialize(stream);
        }            
    }

    //反序列化
    public static MyClass Deserialize(string dataString)
    {
        byte[] data = Convert.FromBase64String(dataString);
        return MyClass.Deserialize(data);
    }
}

其中,利用BinaryFormatter实现序列化和反序列化。


3、测试

创建一个控制台程序,新建一个MyClass类,把上面的代码粘贴进去。测试代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass("Tom");
            Console.WriteLine("序列化之前的名字:" + myClass.Name);

            //序列化
            string dataString = myClass.SerializeString();
            Console.WriteLine(dataString);

            //反序列化
            MyClass newClass = MyClass.Deserialize(dataString);
            Console.WriteLine("反序列化之后:" + newClass.Name);

            Console.ReadKey();
        }
    }
}

执行代码,可以看到序列化之后的内容。已经反序列化之后,还是可以得到原来的内容。


上一篇:主板给HDMI显示器供电

下一篇:我的网站搭建(第37天) 上传图片加水印

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空