C# 中的序列化和反序列化
阅读:16
点赞:0
序列化是将对象转换为易于存储或传输的格式的过程,例如 XML、JSON、SOAP 或二进制格式。反序列化则是将序列化数据转换回对象的过程。
一. XML 序列化
XML 序列化在 .NET 中将对象转换为 XML 格式,方便存储和传输。相比其他序列化方式,XML 序列化关注公共字段和属性,提供简单透明的数据表示。
特点
-
转换为 XML 格式 -
主要用于互操作性 -
仅序列化公共属性,私有属性被排除 -
常用于 Web 服务和配置文件
示例代码
// 员工详细信息类
public class EmployeeDetails
{
public string Name { get; set; } // 姓名
public int Age { get; set; } // 年龄
public string Address { get; set; } // 地址
public string Hobbies { get; set; } // 爱好
public string EmployeeType { get; set; } // 员工类型
}
// 主窗口类
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.Json
或 Newtonsoft.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 { get; set; } // 姓名
public int Age { get; set; } // 年龄
public string Address { get; set; } // 地址
public string Hobbies { get; set; } // 爱好
public string EmployeeType { get; set; } // 员工类型
}
// 主窗口类
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 { get; set; } // 姓名
public int Age { get; set; } // 年龄
public string Address { get; set; } // 地址
public string Hobbies { get; set; } // 爱好
public string EmployeeType { get; set; } // 员工类型
}
// 主窗口类
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# 中实现序列化与反序列化的具体操作。