二进制序列化器、XML序列化器、Json序列化器
二进制序列化器、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.Json
、System.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序列化器相关推荐
- php和js序列化,PHP中serialize和json序列化与反序列化的区别
在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: PHP 1 2 3 4$web=newstdClass; $web-> ...
- json序列化c语言,C语言JSON序列化/反序列化
最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...
- 序列化对象C++对象的JSON序列化与反序列化探索
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...
- python json序列化对象_Python学习之json序列化
一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...
- C# Json 序列化与反序列化一
public class JsonSerializer{/// <summary>/// json序列化/// </summary>/// <typeparam name ...
- Net深入实战系列—JSON序列化那点事儿
序 当前主流的序列化JSON字符串主要有两种方式:JavaScriptSerializer及Json.net(Nuget标识:Newtonsoft.Json).JavaScriptSerializer ...
- mysql 序列化存储_如何将类序列化并直接存储入数据库
本文将从这两个格式器入手,先向大家介绍分别用它们如何实现序列化和反序列化,然后比较两种格式器的不同点.接着我会向大家介绍实现序列化对对象类型的一些要求,同时还要向大家介绍两种不同的序列化方式:基本序列 ...
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
- JMeter关联:JMeter正则表达式提取器与JSON提取器
JMeter使用正则表达式和JSON提取器实现关联 前言 1 关联的释义与示例 2 常用正则表达式详解 3 正则表达式提取器 3.1 参数详解 3.2 使用示例 4 JSON提取器 4.1 参数详解 ...
- jmeter如何通过后置处理器提取(正则提取器、json提取器)做接口关联?
一.后置处理器-正则表达式提取器 1.添加正则表达式提取 2.正则表达式提取面板介绍: 引用名称:提取引用名称,下个请求要引用此参数名称,如填写token,下个请求中用${token} 正则表达式:( ...
最新文章
- mac上使用crontab周期性执行python脚本
- 均线金叉 不破支撑BCH有望延续反弹
- 江西理工大学c语言程序设计竞赛怎么备考,2015年江西理工大学C语言程序设计竞赛(高级组)...
- 货拉拉携手神策数据,数据赋能企业,实现多元颠覆式创新
- 如何给Typora安装主题
- 将可执行文件以资源的方式加入到另一个可执行文件并释放
- Hive JOIN使用详解
- 飞鸽传书软件很多人都会认为他已经做到了
- 手机端html使用地理定位,html5之使用地理定位
- asp.net 学习交流群 130017551
- java 权重 分配_一种按权重分配的Java算法
- 数据结构课程设计(二)---算术表达式求值
- 文件转换swf/flv
- TP-LINK 路由器 无线桥接 设置
- 网站SEO优化数据分析之跳出率+停留时间
- 利用FME(myfme)将MAPGIS格式的土地处用现状图完美转换为CAD
- 译:Two-stream convolutional networks for action recognition in videos
- 原来华为手机的拨号键盘除了打电话,还有这些隐藏功能,涨知识了
- JVM之一:GC垃圾回收原理及算法分析
- mysql数据考试测试题