上一期:
序列化
序列化是指将对象的状态转换为可以储存或传输的格式(例如:XML、JSON或二进制)的过程。反序列化这个过程的逆过程,即将这些格式的数据重新转会对象。
-
Binary Serialization:通过
System.Runtime.Serialization.Formatters.Binary
命名空间下的类实现,适用于需要高效存储或网络传输的情况。 -
XML Serialization:通过
System.Xml.Serialization
命名空间下的类实现,适用于跨平台的数据交换。 -
JSON Serialization:通常使用第三方库如Newtonsoft.Json实现,因为.NET Framework本身不直接支持JSON序列化(不过,在.NET Core和更新版本中,
System.Text.Json
提供了这一功能)。
使用BinaryFormatter进行序列化与反序列化
首先,确保类标记[Serializable]
属性。
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "John Doe", Age = 30 };
string path = "person.dat";
// 序列化
using (FileStream fs = new FileStream(path, FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, person);
}
// 反序列化
using (FileStream fs = new FileStream(path, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
Person deserializedPerson = (Person)formatter.Deserialize(fs);
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
}
}
需要注意的是,虽然BinaryFormatter
易于使用,但由于安全性和兼容性问题,它在未来的.NET版本中可能被弃用。对于新的项目,推荐考虑其他序列化方式,比如JSON序列化。
JSON序列化示例(使用System.Text.Json
)
using System;
using System.IO;
using System.Text.Json;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "Jane Doe", Age = 25 };
string path = "person.json";
// 序列化
string jsonString = JsonSerializer.Serialize(person);
File.WriteAllText(path, jsonString);
// 反序列化
string jsonFromFile = File.ReadAllText(path);
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonFromFile);
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
}
XML序列化使用步骤
-
定义需要序列化的类:确保类具有公共默认构造函数,并且只包含可以序列化的成员(属性或字段)。你可以使用特性(attributes)来控制如何进行序列化。
-
创建XmlSerializer实例:你需要一个
XmlSerializer
实例,它被初始化时需要知道要序列化的类型。 -
序列化对象:调用
Serialize
方法将对象序列化为XML流。 -
反序列化对象:调用
Deserialize
方法从XML流中读取并重建对象。
using System;
using System.IO;
using System.Xml.Serialization;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 默认构造函数对于XmlSerializer是必需的
public Person() {}
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
class Program
{
static void Main()
{
// 创建一个Person对象
Person person = new Person("John Doe", 30);
// 创建XmlSerializer实例,指定序列化的类型
XmlSerializer serializer = new XmlSerializer(typeof(Person));
// 序列化对象到文件
using (TextWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, person);
}
Console.WriteLine("Object has been serialized.");
// 反序列化对象从文件
using (TextReader reader = new StreamReader("person.xml"))
{
Person deserializedPerson = (Person)serializer.Deserialize(reader);
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
}
}