序列化和反序列化的概念
序列化和反序列化是指将对象转换为字节流或其他格式进行存储或传输,以及将存储或传输的数据恢复成对象的过程。在C#中,有多种方式可以实现序列化和反序列化,包括使用BinaryFormatter类、ISerializable接口和XmlSerializer类。
使用BinaryFormatter类进行序列化和反序列化
BinaryFormatter类是C#内置的用于序列化和反序列化对象的类。以下是使用BinaryFormatter类进行序列化和反序列化的步骤:
步骤1:创建要序列化的对象
首先,我们需要创建一个要序列化的对象。例如,我们创建一个名为Person的类:
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
步骤2:创建BinaryFormatter对象
接下来,我们需要创建一个BinaryFormatter对象来执行序列化和反序列化操作:
BinaryFormatter formatter = new BinaryFormatter();
步骤3:序列化对象
将对象序列化为字节数组:
Person person = new Person { Name = "John", Age = 25 };
using (FileStream stream = new FileStream("person.bin", FileMode.Create))
{
formatter.Serialize(stream, person);
}
步骤4:反序列化对象
从字节数组中恢复对象:
using (FileStream stream = new FileStream("person.bin", FileMode.Open))
{
Person deserializedPerson = (Person)formatter.Deserialize(stream);
}
使用ISerializable接口进行序列化和反序列化
ISerializable接口是C#定义的用于自定义对象序列化和反序列化的接口。以下是使用ISerializable接口进行序列化和反序列化的步骤:
步骤1:实现ISerializable接口
首先,在要序列化的对象类中实现ISerializable接口,并定义GetObjectData方法来保存对象状态:
[Serializable]
public class Person : ISerializable
{
public string Name { get; set; }
public int Age { get; set; }
public Person() { }
protected Person(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
Age = info.GetInt32("Age");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Age", Age);
}
}
步骤2:使用BinaryFormatter进行序列化和反序列化
使用BinaryFormatter类进行序列化和反序列化:
BinaryFormatter formatter = new BinaryFormatter();
Person person = new Person { Name = "John", Age = 25 };
using (FileStream stream = new FileStream("person.bin", FileMode.Create))
{
formatter.Serialize(stream, person);
}
using (FileStream stream = new FileStream("person.bin", FileMode.Open))
{
Person deserializedPerson = (Person)formatter.Deserialize(stream);
}
使用XmlSerializer类进行序列化和反序列化
XmlSerializer类是C#内置的用于将对象序列化为XML格式或将XML反序列化为对象的类。以下是使用XmlSerializer类进行序列化和反序列化的步骤:
步骤1:创建要序列化的对象
创建一个要序列化的对象:
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
步骤2:创建XmlSerializer对象
创建一个XmlSerializer对象来执行序列化和反序列化操作:
XmlSerializer serializer = new XmlSerializer(typeof(Person));
步骤3:序列化对象
将对象序列化为XML字符串:
Person person = new Person { Name = "John", Age = 25 };
using (StreamWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, person);
}
步骤4:反序列化对象
从XML字符串中恢复对象:
using (StreamReader reader = new StreamReader("person.xml"))
{
Person deserializedPerson = (Person)serializer.Deserialize(reader);
}
总结
通过本文,我们了解了如何使用C#中的BinaryFormatter类、ISerializable接口和XmlSerializer类进行对象的序列化和反序列化操作。无论是使用二进制格式、自定义接口还是XML格式,这些工具都提供了灵活的方式来存储和传输对象数据。