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

.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; } private string name; public string Name { get { return name; } set { name = value; } } [NonSerialized] //表示下面这个age字段不进行序列化 private int age; public int Age { get { return age; } set { age = value; } } public void SayHi() { Console.WriteLine("大家好,我是{0},今年{1}岁",name,age); } } 调用函数中: List<Peoson> listPers = new List<Peoson>(); Peoson per1 = new Peoson("Roby", 18); Peoson per2 = new Peoson("July", 20); listPers.Add(per1); listPers.Add(per2); SerializeMethod(listPers);//序列化 //ReserializeMethod(); //反序列化成把上面一行注释掉 执行此行 Console.ReadKey(); 序列化和反序列化的方法: static void 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(); } } } } static void SerializeMethod(List<Peoson> listPers) { //序列化 using (FileStream fs = new FileStream("1.bin", FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, listPers); } } }

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>;

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str

javaBean为什么要implements Serializable

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。    什么情况下需要序列化:    1.     当

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )