C#序列化与反序列化:简单易懂的解释
在编程中,我们经常需要将数据从一种形式转换为另一种形式。其中一个常见的情况是将对象转换为一系列字节以便存储或传输,或者从字节重新创建对象。这个过程称为序列化和反序列化。在C#中,我们可以使用内置的序列化器和反序列化器来实现这些操作。
1. 序列化
序列化是将对象转换为字节流的过程。当我们需要将对象存储在硬盘上或通过网络传输时,将对象序列化为字节流非常有用。
首先,我们需要将类标记为可序列化。只需在类定义前面添加 `[Serializable]` 属性即可。例如:
```csharp
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
```
接下来,我们可以使用`BinaryFormatter`类来进行序列化操作。这里我们将一个`Person`对象序列化为字节流:
```csharp
Person person = new Person { Name = "张三", Age = 25 };
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, person);
byte[] bytes = stream.ToArray();
// 将字节数组保存到文件或通过网络发送
```
在上述示例中,我们创建了一个`Person`对象并将其序列化为内存流中。然后,我们可以通过调用`ToArray()`方法将内存流转换为字节数组,并且可以将其保存到文件或传输到其他位置。
2. 反序列化
反序列化是将字节流转换回对象的过程。当我们接收到一个字节流并想要还原成对象时,就需要进行反序列化操作。
让我们使用相同的`Person`类作为示例,将字节数组反序列化为一个`Person`对象:
```csharp
byte[] bytes; // 从文件或网络接收的字节数组
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream(bytes);
Person person = (Person)formatter.Deserialize(stream);
Console.WriteLine($"姓名:{person.Name},年龄:{person.Age}");
```
在上述示例中,我们首先将字节数组放入内存流中。然后,我们使用反序列化器的`Deserialize()`方法将内存流转换为`Person`对象。
3. XML 和 JSON 序列化
除了使用二进制格式进行序列化和反序列化之外,C# 还支持将对象序列化为 XML 或 JSON 格式。这些格式对于与其他平台或语言进行交互非常有用。
XML 序列化和反序列化:
```csharp
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "张三", Age = 25 };
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (TextWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, person);
}
// 反序列化
Person deserializedPerson;
using (TextReader reader = new StreamReader("person.xml"))
{
deserializedPerson = (Person)serializer.Deserialize(reader);
}
```
JSON 序列化和反序列化(使用 Newtonsoft.Json 库):
```csharp
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "张三", Age = 25 };
string json = JsonConvert.SerializeObject(person);
// 将 json 字符串保存到文件或通过网络发送
// 反序列化
Person deserializedPerson = JsonConvert.DeserializeObject
```
总结:
C#的序列化和反序列化功能非常强大,它允许我们将对象转换为字节流以便存储、传输和与其他平台进行交互。无论是使用二进制格式、XML还是JSON,我们都能够使用内置的序列化器和反序列化器实现这些操作。希望本文对你理解C#序列化和反序列化有所帮助!