C# 中的序列化和反序列化

发布:2024-10-22 11:35 阅读:18 点赞:0

序列化是将对象转换为易于存储或传输的格式的过程,例如 XML、JSON、SOAP 或二进制格式。反序列化则是将序列化数据转换回对象的过程。

一. XML 序列化

XML 序列化在 .NET 中将对象转换为 XML 格式,方便存储和传输。相比其他序列化方式,XML 序列化关注公共字段和属性,提供简单透明的数据表示。

特点

  • 转换为 XML 格式
  • 主要用于互操作性
  • 仅序列化公共属性,私有属性被排除
  • 常用于 Web 服务和配置文件

示例代码

// 员工详细信息类
public class EmployeeDetails
{
    public string Name { getset; }  // 姓名
    public int Age { getset; }       // 年龄
    public string Address { getset; } // 地址
    public string Hobbies { getset; } // 爱好
    public string EmployeeType { getset; } // 员工类型
}
// 主窗口类
public partial class MainWindow : Window
{
    EmployeeDetails employee; // 员工对象
    string filePath = @"C:\Users\sanjay\Desktop\Sanjay\SerailizedPath\"// 保存路径

    public MainWindow()
    {
        InitializeComponent();
        employee = new EmployeeDetails
        {
            Name = "Sanjay Kumar",
            Age = 30,
            Address = "Delhi",
            EmployeeType = "Permanent",
            Hobbies = "Cricket"
        };
    }

    // XML 序列化
    private void XmlSerialization_Click(object sender, RoutedEventArgs e)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(EmployeeDetails)); // 创建序列化器
        using (StreamWriter writer = new StreamWriter(Path.Combine(filePath, "Employee.xml"))) // 创建文件写入器
        {
            serializer.Serialize(writer, employee); // 序列化对象
        }
    }

    // XML 反序列化
    private void XmlDESerialization_Click(object sender, RoutedEventArgs e)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(EmployeeDetails)); // 创建序列化器
        using (StreamReader reader = new StreamReader(Path.Combine(filePath, "Employee.xml"))) // 创建文件读取器
        {
            EmployeeDetails employeeDetails = (EmployeeDetails)serializer.Deserialize(reader); // 反序列化对象
            MessageBox.Show($"Name: {employeeDetails.Name}, Age: {employeeDetails.Age}, Address: {employeeDetails.Address}, EmployeeType: {employeeDetails.EmployeeType}, Hobbies: {employeeDetails.Hobbies}"); // 显示信息
        }
    }
}

二. JSON 序列化

在 C# 中,JSON 序列化是将对象转换为 JSON 字符串的过程,反序列化则是将 JSON 字符串转换回对象。可以使用 System.Text.JsonNewtonsoft.Json 库。

特点

  • 转换为 JSON 格式
  • 常用于 Web API 和配置文件
  • 支持多种库

示例代码

// 主窗口类
public partial class MainWindow : Window
{
    EmployeeDetails employee; // 员工对象
    string filePath = @"C:\Users\sanjay\Desktop\Sanjay\SerailizedPath\"// 保存路径

    public MainWindow()
    {
        InitializeComponent();
        employee = new EmployeeDetails
        {
            Name = "Sanjay Kumar",
            Age = 30,
            Address = "Delhi",
            EmployeeType = "Permanent",
            Hobbies = "Cricket"
        };
    }

    // JSON 序列化
    private void JsonSerialization_Click(object sender, RoutedEventArgs e)
    {
        string jsonString = JsonConvert.SerializeObject(employee, Formatting.Indented); // 转换为 JSON 字符串
        File.WriteAllText(Path.Combine(filePath, "Employee.json"), jsonString); // 保存 JSON 字符串
        Debug.WriteLine("Object serialized to employee.json"); // 输出调试信息
    }

    // JSON 反序列化
    private void JsonDESerialization_Click(object sender, RoutedEventArgs e)
    {
        string jsonString = File.ReadAllText(Path.Combine(filePath, "Employee.json")); // 读取 JSON 文件
        EmployeeDetails employee = JsonConvert.DeserializeObject<EmployeeDetails>(jsonString); // 反序列化
        MessageBox.Show($"Name: {employee.Name}, Age: {employee.Age}, Address: {employee.Address}, EmployeeType: {employee.EmployeeType}, Hobbies: {employee.Hobbies}"); // 显示信息
    }
}

三. 二进制序列化

二进制序列化将对象转换为二进制格式,便于保存和传输。此方式需要对象使用 [Serializable] 特性标注。

特点

  • 转换为二进制格式
  • 优化了大小
  • 需要 [Serializable] 特性

示例代码

// 员工详细信息类
[Serializable]
public class EmployeeDetails
{
    public string Name { getset; }  // 姓名
    public int Age { getset; }       // 年龄
    public string Address { getset; } // 地址
    public string Hobbies { getset; } // 爱好
    public string EmployeeType { getset; } // 员工类型
}
// 主窗口类
public partial class MainWindow : Window
{
    EmployeeDetails employee; // 员工对象
    string filePath = @"C:\Users\sanjay\Desktop\Sanjay\SerailizedPath\"// 保存路径

    public MainWindow()
    {
        InitializeComponent();
        employee = new EmployeeDetails
        {
            Name = "Sanjay Kumar",
            Age = 30,
            Address = "Delhi",
            EmployeeType = "Permanent",
            Hobbies = "Cricket"
        };
    }

    // 二进制序列化
    [Obsolete// 表示此方法已过时
    private void BinarySerialization_Click(object sender, RoutedEventArgs e)
    {
        BinaryFormatter formatter = new BinaryFormatter(); // 创建二进制格式化器
        using (FileStream stream = new FileStream(Path.Combine(filePath, "Employee.dat"), FileMode.Create)) // 创建文件流
        {
            formatter.Serialize(stream, employee); // 序列化对象
        }
        Debug.WriteLine("Object serialized to employee.dat"); // 输出调试信息
    }

    // 二进制反序列化
    [Obsolete// 表示此方法已过时
    private void BinaryDESerialization_Click(object sender, RoutedEventArgs e)
    {
        BinaryFormatter formatter = new BinaryFormatter(); // 创建二进制格式化器
        using (FileStream stream = new FileStream(Path.Combine(filePath, "Employee.dat"), FileMode.Open)) // 创建文件流
        {
            EmployeeDetails person = (EmployeeDetails)formatter.Deserialize(stream); // 反序列化对象
            MessageBox.Show($"Name: {person.Name}, Age: {person.Age}, Address: {person.Address}, EmployeeType: {person.EmployeeType}, Hobbies: {person.Hobbies}"); // 显示信息
        }
    }
}

四. SOAP 序列化

SOAP 序列化是将对象转换为 SOAP 定义的 XML 格式的方法,便于网络传输,尤其是 Web 服务。尽管 SOAP 的使用逐渐减少,但仍然有其适用场景。

特点

  • 使用 SOAP 格式
  • 主要用于 Web 服务

示例代码

// 员工详细信息类
public class EmployeeDetails
{
    public string Name { getset; }  // 姓名
    public int Age { getset; }       // 年龄
    public string Address { getset; } // 地址
    public string Hobbies { getset; } // 爱好
    public string EmployeeType { getset; } // 员工类型
}
// 主窗口类
public partial class MainWindow : Window
{
    EmployeeDetails employee; // 员工对象
    string filePath = @"C:\Users\sanjay\Desktop\Sanjay\SerailizedPath\"// 保存路径

    public MainWindow()
    {
        InitializeComponent();
        employee = new EmployeeDetails
        {
            Name = "Sanjay Kumar",
            Age = 30,
            Address = "Delhi",
            EmployeeType = "Permanent",
            Hobbies = "Cricket"
        };
    }

    // SOAP 序列化
    private void SoapSerialization_Click(object sender, RoutedEventArgs e)
    {
        SoapFormatter formatter = new SoapFormatter(); // 创建 SOAP 格式化器
        using (FileStream stream = new FileStream(Path.Combine(filePath, "Employee.soap"), FileMode.Create)) // 创建文件流
        {
            formatter.Serialize(stream, employee); // 序列化对象
        }
        Debug.WriteLine("Object serialized to employee.soap"); // 输出调试信息
    }

    // SOAP 反序列化
    private void SoapDESerialization_Click(object

 sender, RoutedEventArgs e
)

    {
        SoapFormatter formatter = new SoapFormatter(); // 创建 SOAP 格式化器
        using (FileStream stream = new FileStream(Path.Combine(filePath, "employee.soap"), FileMode.Open)) // 创建文件流
        {
            EmployeeDetails person = (EmployeeDetails)formatter.Deserialize(stream); // 反序列化对象
            MessageBox.Show($"Name: {person.Name}, Age: {person.Age}, Address: {person.Address}, EmployeeType: {person.EmployeeType}, Hobbies: {person.Hobbies}"); // 显示信息
        }
    }
}

五. 结论

不同的序列化方法适用于不同的场景,选择时应考虑性能、互操作性和可读性。通过以上示例,可以深入理解在 C# 中实现序列化与反序列化的具体操作。