C#序列化和反序列化:从对象到字节流的魔法之旅

开发
序列化和反序列化是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
点赞
收藏

51CTO技术栈公众号