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

Stella981
• 阅读 765

.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 listPers = new List(); 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 list = bf.Deserialize(fs) as List; if (list != null) { for (int i = 0; i < list.Count; i++) { list[i].SayHi(); } } } } static void SerializeMethod(List 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)); xs.Serialize(fs, listPers); 反序列化: XmlSerializer xs = new XmlSerializer(typeof(List)); List list = xs.Deserialize(fs) as List;

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Wesley13 Wesley13
3年前
javaBean为什么要implements Serializable
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。    什么情况下需要序列化:    1.     当
Stella981 Stella981
3年前
Gson 数据解析
gson和其他现有javajson类库最大的不同时gson需要序列化的实体类不需要使用annotation来标识需要序列化的字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。下面是一个简单的例子:1.public class Person {3.private String name;
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
FastJson 反序列化注意事项
问题描述使用fastJson对json字符串进行反序列化时,有几个点需要注意一下:反序列化内部类反序列化模板类0\.Getter/Setter问题如我们希望返回的一个json串为"name":"name","isDeleted":true,"isEmpty":1
Wesley13 Wesley13
3年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ