1. 什么是二进制序列化和反序列化?
在C#中,二进制序列化和反序列化是一种将对象转换为二进制格式并在需要时将其还原为对象的技术。通常情况下,我们要将对象转换为二进制格式的目的是为了将数据从一个应用程序传递到另一个应用程序,或将数据存储到磁盘上以便以后使用。反序列化则是将这些二进制数据重新转换为对象来使用。
使用二进制序列化和反序列化需要了解以下概念:
序列化(Serialization):指将对象数据转换成二进制的过程。
反序列化(Deserialization):指将二进制数据转换成对象的过程。
串行化器(Serializer):指将对象转换成二进制数据的对象。
2. 如何在C#中实现二进制序列化?
2.1 创建需要序列化的类
在C#中实现二进制序列化需要创建需要序列化的类。为了让类可以被二进制序列化,需要在类声明上添加Serializable
特性,如下所示:
[Serializable]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
上述代码中的Student
类声明上已添加了Serializable
特性,代表该类可以支持二进制序列化。
2.2 序列化和反序列化操作
在C#中,程序员可以使用BinaryFormatter
类进行序列化和反序列化操作。该类位于System.Runtime.Serialization.Formatters.Binary
名称空间中,对该类的主要操作是Serialize
和Deserialize
方法。
下面是一个例子,它序列化一个Student
对象,然后再反序列化:
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
Student student = new Student() { Id = 1, Name = "Tom" };
// Create a binary formatter to serialize the student object
BinaryFormatter formatter = new BinaryFormatter();
// Create a memory stream to store the serialized data
using (MemoryStream stream = new MemoryStream())
{
// Serialize the student object to the memory stream
formatter.Serialize(stream, student);
// Reset the memory stream's position to the beginning
stream.Position = 0;
// Deserialize the student object back from the memory stream
Student deserializedStudent = (Student)formatter.Deserialize(stream);
}
上述代码使用一个Student
对象作为序列化的示例,BinaryFormatter
类将该对象序列化到一个内存流中,并将该内存流反序列化为另一个对象。
2.3 保存序列化数据到文件
上面示例中,我们使用内存流将对象序列化和反序列化。通常情况下,我们也可以将二进制数据保存到文件中,如下所示:
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
Student student = new Student() { Id = 1, Name = "Tom" };
string filename = "student.dat";
// Create a binary formatter to serialize the student object
BinaryFormatter formatter = new BinaryFormatter();
// Create a file stream to store the serialized data
using (FileStream stream = new FileStream(filename, FileMode.Create))
{
// Serialize the student object to the file stream
formatter.Serialize(stream, student);
}
// Deserialize the student object back from the file
using (FileStream stream = new FileStream(filename, FileMode.Open))
{
Student deserializedStudent = (Student)formatter.Deserialize(stream);
}
上述示例演示了将二进制数据保存到文件中的操作。我们使用一个FileStream
对象来操作文件,这比较适合于较大的序列化数据,因为内存流可能会对系统内存造成负担。