首页 > 数据库 > 数据库开发技术 > C#序列化和反序列化:从对象到字节流的魔法之旅
在C#编程中,序列化和反序列化是两个核心概念,它们分别代表着将对象状态转换为可以存储或传输的形式(通常是字节流),以及将这种形式的数据恢复为原始对象状态的过程。简单来说,序列化就是将对象转换为流(如文件、网络流等),而反序列化则是将这些流转换回原始对象。
在C#中,可以通过多种方式序列化对象,比如使用BinaryFormatter、XmlSerializer、Json.NET(Newtonsoft.Json)或C#内置的System.Text.Json等。
BinaryFormatter进行序列化
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; }
}
public class SerializationExample
{
public static void Main()
{
Person person = new Person { Name = "Alice", Age = 30 };
// 序列化对象到内存流
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, person);
// 获取序列化后的字节数组
byte[] serializedData = ms.ToArray();
// 通常这里可以将serializedData保存到文件或发送到网络
}
}
}
反序列化是将序列化的数据转换回原始对象的过程。
BinaryFormatter进行反序列化
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class DeserializationExample
{
public static void Main()
{
// 假设我们有一个之前序列化过的字节数组
byte[] serializedData = ...; // 从文件或网络加载的序列化数据
// 反序列化字节数组到对象
using (MemoryStream ms = new MemoryStream(serializedData))
{
BinaryFormatter formatter = new BinaryFormatter();
Person deserializedPerson = (Person)formatter.Deserialize(ms);
// 现在deserializedPerson包含了原始Person对象的数据
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");
}
}
}
安全性:某些序列化方式(如BinaryFormatter)可能存在安全漏洞。在安全性要求较高的场景下,建议使用更加安全的序列化方式,如System.Text.Json或Newtonsoft.Json。
跨平台兼容性:不同的序列化方式在不同的平台和语言上的支持程度可能不同。例如,BinaryFormatter是特定于.NET的,而JSON则更加通用。
版本兼容性:当序列化的对象在不同版本的应用程序之间传输时,需要确保序列化和反序列化双方都使用了兼容的序列化方式。
序列化和反序列化是C#编程中处理对象持久化和跨平台通信的重要技术。通过选择合适的序列化方式,并遵循最佳实践,可以确保数据的正确性和安全性。
原文作者:后端Q;如有侵权,请联系管理员删除。