诗闵

努力 坚持 终有回报

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

C# 序列化(Serialize)与反序列化(Deserialize)

   序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

 .NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

1.BinaryFormatter 

命名空间:System.Runtime.Serialization.Formatters.Binary;
下面先定义一个可序列化类:

复制代码
[Serializable] //表示该类可被序列化
class Peoson
{
public Peoson() { }
public Peoson(string name, int age)
{
this.name = name;
this.age = age;
}
privatestring name;
publicstring Name
{
get { return name; }
set { name = value; }
}
[NonSerialized]
//表示下面这个age字段不进行序列化
privateint age;
publicint Age
{
get { return age; }
set { age = value; }
}
publicvoid SayHi()
{
Console.WriteLine(
"大家好,我是{0},今年{1}岁",name,age);
}
}
复制代码

Main函数中:

复制代码
List<Peoson> listPers =new List<Peoson>();
Peoson per1
=new Peoson("张三", 18);
Peoson per2
=new Peoson("李四", 20);
listPers.Add(per1);
listPers.Add(per2);
SerializeMethod(listPers);
//ReserializeMethod(); //反序列化成把上面一行注释掉 执行此行
Console.ReadKey();
复制代码

序列化和反序列化的方法:

复制代码
staticvoid ReserializeMethod()
{
//反序列化
using (FileStream fs =new FileStream("1.bin", FileMode.Open))
{
BinaryFormatter bf
=new BinaryFormatter();
List
<Peoson> list = bf.Deserialize(fs) as List<Peoson>;
if (list !=null)
{

for (int i =0; i < list.Count; i++)
{
list[i].SayHi();
}
}

}
}

staticvoid SerializeMethod(List<Peoson> listPers)
{
//序列化
using (FileStream fs =new FileStream("1.bin", FileMode.Create))
{
BinaryFormatter bf
=new BinaryFormatter();
bf.Serialize(fs, listPers);
}
}
}
复制代码

反序列化输出结果:

大家好,我是张三,今年0岁

大家好,我是李四,今年0岁

由此看出,未序列化的字段存储的值为空。

2、使用XmlSerializer进行串行化
    关于格式化器还有一个问题,假设我们需要XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。
    如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:
    a.添加System.Xml.Serialization命名空间。
    b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。
    c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。
序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
 List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

posted on   诗闵  阅读(5027)  评论(0编辑  收藏  举报

编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示