二进制序列化器、XML序列化器、Json序列化器

序列化是将对象的状态信息转换未可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区读取或反序列化对象的状态,重新创建对象。

序列化之前:对象

序列化之后:把对象转换成另一种形式存储

1、二进制序列化器

BinaryFormatter

保存成二进制数据流。

示例:

序列化:
public class Student{public Student(int id, string name, int age, string grade){this.ID = id;this.Name = name;this.Age = age;this.Grade = grade;}public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }public string Grade { get; set; }}
`
`
class Program{static void Main(string[] args){List<Student> students = new List<Student>();for (int i = 1; i < 10; i++){Student student = new Student(i, "学生" + i, 18 + i, "年级二");students.Add(student);}FileStream fileStream = new FileStream(@"E:\dotnet\SerilizeAndDeserialize\SerilizeAndDeserialize\data\student.dat", FileMode.OpenOrCreate);BinaryFormatter bFormat = new BinaryFormatter();bFormat.Serialize(fileStream, students);fileStream.Close();Console.WriteLine("序列化成功");}}
`

运行代码,此时会遇到如下图报错;

Student没有标记序列化。

解决方法
   [Serializable]//如果要想保存某个class中的字段,必须在class前面加个这样Attributepublic class Student{public Student(int id, string name, int age, string grade){this.ID = id;this.Name = name;this.Age = age;this.Grade = grade;}public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }public string Grade { get; set; }}

之后可以看到成功序列化后,保存至student.dat文件中。

反序列化:
FileStream stream = new FileStream(@"E:\dotnet\SerilizeAndDeserialize\SerilizeAndDeserialize\data\student.dat", FileMode.Open);BinaryFormatter bdFormat = new BinaryFormatter();List<Student> students1 = (List<Student>)bFormat.Deserialize(stream);stream.Close();
Console.WriteLine("反序列化成功");
进一步地:

从 .NET 5.开始,以下 API 标记为已过时

详见:

SYSLIB0011:BinaryFormatter 序列化已过时

解决方法

请考虑使用 JsonSerializer 或 XmlSerializer,而不是 BinaryFormatter。

2、XML序列化器

XmlSerializer

保存成XML文件,但没有其他额外信息。另外需要注意的是,XmlSerializer只能保存public类型的字段,而其他两种类型能保存所有类型的字段。

序列化:

         Circle circle = new Circle{Radius = 10.1,BgColor = "Black"};XmlDocument xd = new XmlDocument();using (StringWriter sw = new StringWriter()){XmlSerializer xz = new XmlSerializer(circle.GetType());xz.Serialize(sw, circle);Console.WriteLine(sw.ToString());xd.LoadXml(sw.ToString());xd.Save(@"E:\C#\SerilizeAndDeserialize\SerilizeAndDeserialize\data\circle.xml");}

反序列化:

Circle circle2 = new Circle();using (XmlReader reader = XmlReader.Create(@"E:\C#\SerilizeAndDeserialize\SerilizeAndDeserialize\data\circle.xml")){XmlSerializer xz = new XmlSerializer(circle2.GetType());circle2 = (Circle)xz.Deserialize(reader);Console.WriteLine(reader.ToString());}

三、JSON序列化器

Json序列化有很多种方法,这里我们介绍.Net 标准库 System.Text.JsonSystem.Runtime.Serialization.Json 和 Newtonsoft 库Newtonsoft.Json;

System.Text.Json
            Circle circle = new Circle{Radius = 10.1,BgColor = "Black"};string json = JsonSerializer.Serialize(circle); //序列化Circle circle2 = JsonSerializer.Deserialize<Circle>(json); //反序列化
Newtonsoft.Json
string json = JsonConvert.SerializeObject(circle); //序列化
Circle circle2 = JsonConvert.DeserializeObject<Circle>(json); //反序列化
System.Runtime.Serialization.Json
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(Circle));using (MemoryStream memoryStream = new MemoryStream()){dataContractJsonSerializer.WriteObject(memoryStream, circle);}
DataContractJsonSerializer dataContractJsonSerializer1 = new DataContractJsonSerializer(typeof(Circle));MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));Circle result = (Circle)((object)dataContractJsonSerializer1.ReadObject(memoryStream));

二进制序列化器、XML序列化器、Json序列化器相关推荐

  1. php和js序列化,PHP中serialize和json序列化与反序列化的区别

    在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: PHP 1 2 3 4$web=newstdClass; $web-> ...

  2. json序列化c语言,C语言JSON序列化/反序列化

    最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...

  3. 序列化对象C++对象的JSON序列化与反序列化探索

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...

  4. python json序列化对象_Python学习之json序列化

    一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...

  5. C# Json 序列化与反序列化一

    public class JsonSerializer{/// <summary>/// json序列化/// </summary>/// <typeparam name ...

  6. Net深入实战系列—JSON序列化那点事儿

    序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...

  7. mysql 序列化存储_如何将类序列化并直接存储入数据库

    本文将从这两个格式器入手,先向大家介绍分别用它们如何实现序列化和反序列化,然后比较两种格式器的不同点.接着我会向大家介绍实现序列化对对象类型的一些要求,同时还要向大家介绍两种不同的序列化方式:基本序列 ...

  8. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  9. JMeter关联:JMeter正则表达式提取器与JSON提取器

    JMeter使用正则表达式和JSON提取器实现关联 前言 1 关联的释义与示例 2 常用正则表达式详解 3 正则表达式提取器 3.1 参数详解 3.2 使用示例 4 JSON提取器 4.1 参数详解 ...

  10. jmeter如何通过后置处理器提取(正则提取器、json提取器)做接口关联?

    一.后置处理器-正则表达式提取器 1.添加正则表达式提取 2.正则表达式提取面板介绍: 引用名称:提取引用名称,下个请求要引用此参数名称,如填写token,下个请求中用${token} 正则表达式:( ...

最新文章

  1. mac上使用crontab周期性执行python脚本
  2. 均线金叉 不破支撑BCH有望延续反弹
  3. 江西理工大学c语言程序设计竞赛怎么备考,2015年江西理工大学C语言程序设计竞赛(高级组)...
  4. 货拉拉携手神策数据,数据赋能企业,实现多元颠覆式创新
  5. 如何给Typora安装主题
  6. 将可执行文件以资源的方式加入到另一个可执行文件并释放
  7. Hive JOIN使用详解
  8. 飞鸽传书软件很多人都会认为他已经做到了
  9. 手机端html使用地理定位,html5之使用地理定位
  10. asp.net 学习交流群 130017551
  11. java 权重 分配_一种按权重分配的Java算法
  12. 数据结构课程设计(二)---算术表达式求值
  13. 文件转换swf/flv
  14. TP-LINK 路由器 无线桥接 设置
  15. 网站SEO优化数据分析之跳出率+停留时间
  16. 利用FME(myfme)将MAPGIS格式的土地处用现状图完美转换为CAD
  17. 译:Two-stream convolutional networks for action recognition in videos
  18. 原来华为手机的拨号键盘除了打电话,还有这些隐藏功能,涨知识了
  19. JVM之一:GC垃圾回收原理及算法分析
  20. mysql数据考试测试题

热门文章

  1. [POI2006] OKR-period of words
  2. matlab循环遍历数组_matlab循环语句for怎么用
  3. IM即时通讯哇呼--解析
  4. 每日阅读2019年04月04日(时代周刊)
  5. StackFlow 之 MYSQL之timestamp
  6. TKL配列新品键盘:Keychron V3
  7. PHP判断QQ是否在线代码。
  8. unity使用steamVR插件导出游戏头显无反应问题
  9. centos7的安装与配置-大学生初学者
  10. 【WPF】Popup