在现代软件开发中,序列化与反序列化是数据持久化和交换的关键技术。C# 提供了多种序列化技术,包括二进制序列化、XML序列化、JSON序列化等。本文将深入探讨这些技术的工作原理、使用场景、最佳实践以及一些高级技巧。
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是将这些格式转换回对象的过程。这在数据持久化、网络通信和软件间数据交换中非常有用。
二进制序列化是将对象转换为二进制格式的过程。这种格式通常不是人类可读的,但它非常高效且安全,因为它不会暴露于外部环境。
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// 序列化
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream("person.dat", FileMode.Create))
{
formatter.Serialize(stream, new Person { Name = "John Doe", Age = 30 });
}
// 反序列化
using (FileStream stream = new FileStream("person.dat", FileMode.Open))
{
Person person = (Person)formatter.Deserialize(stream);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}XML序列化将对象转换为可读的XML格式。这种格式易于理解和调试,适合于需要跨平台或跨语言的数据交换。
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// 序列化
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StreamWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, new Person { Name = "John Doe", Age = 30 });
}
// 反序列化
using (StreamReader reader = new StreamReader("person.xml"))
{
Person person = (Person)serializer.Deserialize(reader.BaseStream);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}JSON序列化是将对象转换为JSON格式的过程。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// 使用 System.Text.Json
string jsonString = JsonSerializer.Serialize(new Person { Name = "John Doe", Age = 30 });
Person person = JsonSerializer.Deserialize<Person>(jsonString);
// 使用 Newtonsoft.Json
string jsonString = JsonConvert.SerializeObject(new Person { Name = "John Doe", Age = 30 });
Person person = JsonConvert.DeserializeObject<Person>(jsonString);通过实现 ISerializable 接口或使用特性,可以自定义对象的序列化和反序列化过程。
[Serializable]
public class Person : ISerializable
{
public string Name { get; set; }
public int Age { get; set; }
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);
}
}在.NET 6及以上版本,可以使用源生成器来生成序列化代码,提高性能并减少运行时的反射使用。
在序列化对象图时,循环引用是一个常见问题。可以通过使用 ReferenceLoopHandling 特性或在序列化库中配置相应的选项来处理。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。