一、概述:
序列化是将对象实例的状态存储到存储媒介的过程。将对象的公共字段、私有字段以及类的名称(包括类所在的程序集)转换为字节流,再把字节流写入数据流中。随后对对象进行反序列化时,将创建出与原对象相同的副本。
它方便我们存储复杂对象到数据库中。
二、序列化:
使用Serializable属性对对象进行标记。(以下使用C#进行讲解)
using System;
namespace ClassSerializable
{
[Serializable]
class Player
{
public int userId;
public string userName;
public byte age;
}
}
下面将Player类对象序列化,然后将序列化的数据保存到名为data.bin的文件中。
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ClassSerializable
{
class Program
{
static void Main(string[] args)
{
Player player = new Player();
player.userId = 001;
player.userName = "ClassSerializable";
player.age = 24;
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("data.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, player);
stream.Close();
}
}
}
Debug目录可看到生成的data.bin文件。
上述代码先创建player对象,然后使用"new FileStream()"创建一个名为data.bin的文件。formatter.Serialize(stream,player)会将player中的所有成员变量序列化成二进制数据,然后保存到stream所对应的文件data.bin中。
三、反序列化
下面将序列化后的对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace ClassSerializable
{
class Program
{
static void Main(string[] args)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("data.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
Player player = (Player)formatter.Deserialize(stream);
stream.Close();
Console.WriteLine(player.userId);
Console.WriteLine(player.userName);
Console.WriteLine(player.age);
}
}
}