C#序列化详解示例
本文将详细介绍C#中的序列化操作,并提供了两个示例,帮助读者更加深入地理解序列化的概念和操作方法。
什么是序列化
序列化是将一个对象转换成字节流的过程,通常用于在网络上或本地存储中传输或保存数据。在C#中,使用类库中的System.Runtime.Serialization
命名空间中的类来实现序列化与反序列化操作。
如何序列化一个对象
步骤1:创建需要序列化的类
首先需要创建一个需要进行序列化的类,例如以下示例:
[Serializable]
class Person
{
public string Name;
public int Age;
}
可以看到这个Person
类声明了[Serializable]
特性,这表示该类可以进行序列化操作。
步骤2:创建序列化对象
使用BinaryFormatter
类来创建序列化对象,代码如下:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
BinaryFormatter formatter = new BinaryFormatter();
步骤3:序列化对象
使用Serialize
方法将对象序列化成字节流,代码如下:
Person p = new Person() { Name = "张三", Age = 20 };
using (FileStream fs = new FileStream("person.dat", FileMode.Create))
{
formatter.Serialize(fs, p);
}
这个例子中将Person
对象序列化成person.dat
文件。
如何反序列化一个对象
步骤1:创建需要反序列化的类
首先需要创建一个需要进行反序列化的类,例如以下示例:
[Serializable]
class Person
{
public string Name;
public int Age;
}
可以看到这个Person
类同样声明了[Serializable]
特性,这表示该类可以进行序列化操作。
步骤2:创建反序列化对象
使用BinaryFormatter
类来创建反序列化对象,代码如下:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
BinaryFormatter formatter = new BinaryFormatter();
步骤3:反序列化对象
使用Deserialize
方法将字节流反序列化成对象,代码如下:
using (FileStream fs = new FileStream("person.dat", FileMode.Open))
{
Person p = (Person)formatter.Deserialize(fs);
Console.WriteLine($"Name:{p.Name} Age:{p.Age}");
}
这个例子中将person.dat
文件反序列化成Person
对象,并输出Name
和Age
属性。
示例1:将对象序列化到内存中
下面示例将Person
对象序列化成字节数组,然后反序列化回对象:
Person p = new Person() { Name = "李四", Age = 25 };
MemoryStream ms = new MemoryStream();
formatter.Serialize(ms, p);
ms.Position = 0;
Person p2 = (Person)formatter.Deserialize(ms);
Console.WriteLine($"Name:{p2.Name} Age:{p2.Age}");
这个例子中,使用MemoryStream
类来将序列化后的Person
对象保存到内存中,并通过Position
属性将MemoryStream
重置到起始位置,然后反序列化得到Person
对象。
示例2:序列化与远程调用
下面示例将Person
对象序列化成字节数组,并通过远程调用传递该字节数组:
Person p = new Person() { Name = "王五", Age = 30 };
using (MemoryStream ms = new MemoryStream())
{
formatter.Serialize(ms, p);
ms.Position = 0;
byte[] buffer = ms.ToArray();
// 远程调用
RemoteCall(buffer);
}
这个例子中,通过将序列化后的Person
对象保存到字节数组中,可以方便地通过远程调用传递该对象。RemoteCall
方法是用于模拟远程调用的一个示例,其代码如下:
void RemoteCall(byte[] buffer){
using (MemoryStream ms = new MemoryStream(buffer))
{
Person p = (Person)formatter.Deserialize(ms);
Console.WriteLine($"Name:{p.Name} Age:{p.Age}");
}
}
通过反序列化传递过来的字节数组,可以得到原始的Person
对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#序列化详解示例 - Python技术站