最新要闻
- 环球焦点!【全球新视野】今日热议:焦点快播:海通证券:货币紧缩政策边际放缓 贵金属有望迎来板块性投资机会 每日热门_焦点滚动_天天新要闻
- AMD为ROG掌机定制Zen4+RDNA3神U:功耗只有9W!|环球百事通
- 【聚看点】华为严打App互相拉起!不整改者直接下线、上报工信部
- 第一次!嫦娥五号发现月球天然玻璃:建基地的好材料-天天热头条
- 特斯拉中国五一出行报告:百位车友日行千里 没有里程焦虑 天天快报
- 去哪里?阿斯报:布斯克茨预计在巴萨夺冠后宣布自己的未来-世界讯息
- 美国统治全球48%半导体市场:研发投入占比2.5倍于中国
- 通讯!宝德暴芯x86处理器发布:百分百复刻Intel 10代酷睿
- 贾跃亭没忘记乐视!时隔6年 首次互动|环球微资讯
- 世界杯预选赛欧洲区第三轮德国主场被爆冷 当前快报
- 男子1天吃10顿暴瘦110斤:确诊为甲亢!医生科普
- 每日快看:董宇辉自曝曾抗拒卖货写检讨:一度撑不下去想放弃
- 每日信息:银河麒麟桌面系统升级V10 SP1 2303:固若金汤 真心好用!
- 当前视点!巴萨唯一爆点要走,5000万欧元违约金,让签约不要太容易
- 全球速讯:海康威视推双盘位NAS:1199元 最大40TB容量
- 因“挖呀挖”爆火美女老师身陷6大传闻:职业网红?一场直播打赏200多万?-天天要闻
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ASP.NET Core MVC 从入门到精通之序列化
随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session等内容,今天继续讲解ASP.NET Core MVC 中序列化等相关内容,仅供学习分享使用。
什么是序列化和反序列化?
序列化是将对象状态转换为可保持或传输的形式的过程。 序列化的补集是反序列化,后者将流转换为对象。 这两个过程一起保证能够存储和传输数据。
(相关资料图)
序列化应用场景
在实际应用中,序列化和反序列化,并不局限于ASP.NET Core MVC项目,在其他类型的项目中,也比较常见。具体场景如下所示:
- 将内存的对象序列化后保存在本地,上传到某些特定位置,如:共享目录,FTP,供第3方系统识别读取。
- 与第3方进行通信,对方只能接收二进制类型字节流数据,
- 保存Session,Cookie等场景
- 跨平台,跨语言交互等场景
常见序列化格式
常见的序列化数据格式有:
- 整体二进制,将实例对象整体序列化成二进制,
- xml格式,将实例对象序列化成XML数据格式,多用于WebService,
- json格式,将实例对象序列化成JSON文件格式,多用于WebAPI等Restful数据调用,
- Protobuf,即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。
序列化示例
在本示例中,为便于比较序列化后内容大小,将序列化后内容保存到本地文件,且实现了序列化和反序列化功能。
1. 安装第三方库
序列化JSON和Protobuf需要安装第三方库,可通过NuGet包管理器进行安装,如下所示:
2. 序列化帮助类接口
为了统一调用方式,特定义序列化帮助类接口,不同实现方式,只需实现对应接口即可,接口定义如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApp2 8 { 9 ///10 /// 序列化帮助类接口11 /// 12 public interface ISerializeHelper13 {14 ///15 /// 序列化16 /// 17 ///18 /// 19 /// 序列化后保存路径20 void Serialize (T t, string path) where T : class;21 22 /// 23 /// 反序列化24 /// 25 ///26 /// 反序列化文件路径27 /// 28 T Deserialize (string path) where T : class;29 }30 }
3. 定义序列化模型类Person
在本示例中,为了比较序列化格式的不同结果,定义一个测试类,如下所示:
1 using ProtoBuf; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApp2 9 {10 ///11 /// 个人信息12 /// 13 [ProtoContract]14 [Serializable]15 public class Person16 {17 ///18 /// 唯一标识19 /// 20 [ProtoMember(1)]21 public int Id { get; set; }22 23 ///24 /// 姓名25 /// 26 [ProtoMember(2)]27 public string Name { get; set; }28 29 ///30 /// 生日31 /// 32 [ProtoMember(3)]33 public DateTime Birthday { get; set; }34 35 public override string ToString()36 {37 return $"Id={Id},Name={Name},Birthday={Birthday.ToString("yyyy-MM-dd HH:mm:ss.fff")}";38 }39 40 }41 }
注意:定义Person时,有以下2点需要注意:
- 进行整体二进制序列化,必须将类标记为Serializable,否则会抛异常。
- Protobuf序列化需要将类标记为ProtoContract,并将需要序列化的属性标记为ProtoMember
4. 整体二进制
整体二进制是将实例对象整体序列化成二进制字节流,以及从二进制字节流反序列成实例对象,如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Runtime.Serialization.Formatters.Binary; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace ConsoleApp210 {11 internal class BinHelper : ISerializeHelper12 {13 public T Deserialize(string path) where T:class14 {15 string filePath = path;16 T t;17 using (FileStream fs = new FileStream(filePath, FileMode.Open))18 {19 BinaryFormatter bf = new BinaryFormatter();20 t = bf.Deserialize(fs) as T;21 }22 return t;23 }24 25 public void Serialize (T t, string path) where T : class26 {27 string filePath = path;28 using (FileStream fs = new FileStream(filePath, FileMode.Create))29 {30 BinaryFormatter bf = new BinaryFormatter();31 bf.Serialize(fs, t);32 }33 }34 }35 }
5. XML格式
XML是一种可扩展标记语言,多用于接口调用及数据传输,语言无关,曾经也是风靡一时,是接口开发的首选。序列化XML代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 using System.Xml.Serialization; 8 9 namespace ConsoleApp210 {11 public class XmlHelper : ISerializeHelper12 {13 public T Deserialize(string path) where T : class14 {15 string filePath = path;16 T t;17 using (FileStream fs = new FileStream(filePath, FileMode.Open))18 {19 XmlSerializer serializer = new XmlSerializer(typeof(Person));20 object obj = serializer.Deserialize(fs);21 t = obj as T;22 }23 return t;24 }25 26 public void Serialize (T t, string path) where T : class27 {28 string filePath = path;29 using (FileStream fs = new FileStream(filePath, FileMode.Create))30 {31 XmlSerializer serializer = new XmlSerializer(typeof(Person));32 serializer.Serialize(fs, t);33 }34 }35 }36 }
6. JSON格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可使人们很容易地进行阅读和编写,同时也方便了机器进行解析和生成。JSON适用于进行数据交互的场景,如网站前台与后台之间的数据交互。JSON是比XML更简单的一种数据交换格式,它采用完全独立于编程语言的文本格式来存储和表示数据。序列化JSON一般采用第3方库Newtonsoft.Json来实现,具体代码如下所示:
1 using Newtonsoft.Json; 2 using System; 3 using System.Collections.Generic; 4 using System.IO; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace ConsoleApp210 {11 internal class JsonHelper : ISerializeHelper12 {13 public T Deserialize(string path) where T : class14 {15 T t;16 using (StreamReader file = File.OpenText(path))17 {18 JsonSerializer serializer = new JsonSerializer();19 t = (T)serializer.Deserialize(file, typeof(T));20 21 }22 return t;23 }24 25 public void Serialize (T t, string path) where T : class26 {27 using (StreamWriter file = File.CreateText(path))28 {29 JsonSerializer serializer = new JsonSerializer();30 serializer.Serialize(file, t);31 }32 }33 }34 }
7. Protobuf格式
Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。序列化Protobuf格式代码如下:
1 using ProtoBuf; 2 using System; 3 using System.Collections.Generic; 4 using System.IO; 5 using System.Linq; 6 using System.Runtime.Serialization.Formatters.Binary; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace ConsoleApp211 {12 internal class ProtobufHelper : ISerializeHelper13 {14 public T Deserialize(string path) where T : class15 {16 string filePath = path;17 T t;18 using (FileStream fs = new FileStream(filePath, FileMode.Open))19 {20 t = Serializer.Deserialize (fs);21 }22 return t;23 }24 25 public void Serialize (T t, string path) where T : class26 {27 string filePath = path;28 using (FileStream fs = new FileStream(filePath, FileMode.Create))29 {30 Serializer.Serialize (fs, t);31 }32 }33 }34 }
8. 实例测试
对同一个对象,进行不同格式的序列化,如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApp2 8 { 9 internal class Program10 {11 static void Main(string[] args)12 {13 Person person = new Person()14 {15 Id = 1,16 Name = "公子小六",17 Birthday = DateTime.Now,18 };19 //bin格式序列化20 var binHelper = new BinHelper();21 string binPath = @"D:\serialize\person.bin";22 binHelper.Serialize(person, binPath);23 24 //xml格式序列化25 var xmlHelper = new XmlHelper();26 string xmlPath = @"D:\serialize\person.xml";27 xmlHelper.Serialize (person, xmlPath);28 29 //json格式序列化30 var jsonHelper = new JsonHelper(); 31 string jsonPath = @"D:\serialize\person.json";32 jsonHelper.Serialize (person, jsonPath);33 34 //protobuf格式序列化35 var protoHelper= new ProtobufHelper();36 var protoPath = @"D:\serialize\person.proto";37 protoHelper.Serialize (person, protoPath);38 }39 }40 }
反序列化,将本地文件反序列化成内存对象,如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApp2 8 { 9 internal class Program10 {11 static void Main(string[] args)12 {13 //bin格式反序列化14 var binHelper = new BinHelper();15 string binPath = @"D:\serialize\person.bin";16 var p1 = binHelper.Deserialize(binPath);17 //xml格式反序列化18 var xmlHelper = new XmlHelper();19 string xmlPath = @"D:\serialize\person.xml";20 var p2 = xmlHelper.Deserialize (xmlPath);21 //json格式反序列化22 var jsonHelper = new JsonHelper(); 23 string jsonPath = @"D:\serialize\person.json";24 var p3 = jsonHelper.Deserialize (jsonPath);25 //protobuf格式反序列化26 var protoHelper= new ProtobufHelper();27 var protoPath = @"D:\serialize\person.proto";28 var p4= protoHelper.Deserialize (protoPath);29 30 Console.WriteLine($"p1:{p1}");31 Console.WriteLine($"p2:{p2}");32 Console.WriteLine($"p3:{p3}");33 Console.WriteLine($"p4:{p4}");34 }35 }36 }37
序列化大小比较
序列化后保存到本地的文件,如下所示:
对Person按不同格式序列化后的本地文件大小进行比较,具体如下:
- 整体二进制格式:person.bin 225字节
- XML格式:person.xml 242字节
- JSON格式:person.json 77字节
- Protobuf格式:person.proto 29字节
经过比较,Proto最小,XML最大,所以在对于大小要求比较严格的场景,可优先考虑Protobuf格式。
以上就是ASP.NET Core MVC 从入门到精通之序列化的全部内容。
关键词:
-
环球焦点!【全球新视野】今日热议:焦点快播:海通证券:货币紧缩政策边际放缓 贵金属有望迎来板块性投资机会 每日热门_焦点滚动_天天新要闻
智通财经APP获悉,海通证券发布研究报告称,5月的加息或是美联储最后一次加息,贵金属有望在货币紧缩政策边
来源: ASP.NET Core MVC 从入门到精通之序列化
网络基础 CAS协议学习总结_天天新资讯
环球观点:Git使用经验总结1
环球焦点!【全球新视野】今日热议:焦点快播:海通证券:货币紧缩政策边际放缓 贵金属有望迎来板块性投资机会 每日热门_焦点滚动_天天新要闻
AMD为ROG掌机定制Zen4+RDNA3神U:功耗只有9W!|环球百事通
【聚看点】华为严打App互相拉起!不整改者直接下线、上报工信部
第一次!嫦娥五号发现月球天然玻璃:建基地的好材料-天天热头条
特斯拉中国五一出行报告:百位车友日行千里 没有里程焦虑 天天快报
去哪里?阿斯报:布斯克茨预计在巴萨夺冠后宣布自己的未来-世界讯息
送电子书福利啦!|每日关注
美国统治全球48%半导体市场:研发投入占比2.5倍于中国
通讯!宝德暴芯x86处理器发布:百分百复刻Intel 10代酷睿
贾跃亭没忘记乐视!时隔6年 首次互动|环球微资讯
世界杯预选赛欧洲区第三轮德国主场被爆冷 当前快报
.NET 6学习笔记(8)生成自签证书
男子1天吃10顿暴瘦110斤:确诊为甲亢!医生科普
每日快看:董宇辉自曝曾抗拒卖货写检讨:一度撑不下去想放弃
每日信息:银河麒麟桌面系统升级V10 SP1 2303:固若金汤 真心好用!
当前视点!巴萨唯一爆点要走,5000万欧元违约金,让签约不要太容易
全球速讯:海康威视推双盘位NAS:1199元 最大40TB容量
因“挖呀挖”爆火美女老师身陷6大传闻:职业网红?一场直播打赏200多万?-天天要闻
三国志战略版象兵战法怎么样 三国志战略版象兵战法搭配
挂载NTFS分区,离线安装NTFS-3G(Linux挂载NTFS格式磁盘的方法)
《塞尔达传说:王国之泪》偷跑后:任天堂大规模“清理”Switch相关软件
腾势汽车五一出行报告:座椅零重力成最爱用智能功能 被使用84万次-世界最资讯
世界新动态:葱花饼怎样做好吃?
“秀色”可餐鲜花入馔有讲究 谨防过敏或中毒_每日快播
环球速看:治堵神器!比亚迪云巴在湖南大王山即将运营:串联十余处景点
广东强对流天气上线 多地暴雨大风:汕尾3小时倒水111.1毫米|世界微动态
对标华为昆仑!荣耀将推出巨犀玻璃面板:Magic4已提前用上
创维汽车黄宏生:盈亏平衡点是卖10万辆 明年实现
收购动视暴雪还有机会!微软聘请顶级反垄断律师对阵CMA 全球今头条
全球今头条!称比亚迪仰望U8原地掉头是欺骗大众 38万粉丝UP主道歉
1163 Dijkstra Sequence + 层序遍历 + 链式前向星_环球热点
马普龙霸王龙谁厉害_马普龙vs霸王龙 今日播报
《塞尔达传说:王国之泪》发售前惨遭偷跑!Epic:买不起可以玩《原神》
【天天时快讯】超越《复联》!《银河护卫队3》创漫威影史最高分
桥本环奈的影视剧_桥本环奈影视作品 焦点热闻
全球最新:女子深夜加班回家吃榴莲被丈夫指责 网友质疑摆拍:头顶长了摄像头
巴菲特看好微软:在收购动视暴雪上已经十分出色|全球信息
动态:又一新造车濒临倒闭:仅交付6台车 和富士康有关
全球今亮点!又一新势力车企申请破产 经销商曾集体维权称被坑几百万
近日择机发射!天舟六号船箭组合体转运至发射区_世界播资讯
这几类蔬菜或自带“毒素”,吃前必须焯水,有两种正当季-今日报
每日动态!【金融街发布】国家外汇管理局:4月末我国外储规模为32048亿美元 环比上升0.66%
【环球新要闻】国王杯冠军榜:巴萨31冠居首,皇马20冠排第三
世界动态:上海官方公布4月超速排行榜:第一名真能追高铁了 一秒67米
回忆杀!“品如的苹果手机怎么是翻盖的”引热议 网友又来考古
Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程 当前速讯
视讯!OpenAI CLIP 关键点 - 连接图像和文字
宁德时代回应原材料价格下跌:不存在大幅减值风险
把苹果股票卖了!巴菲特:两年前犯过错 很愚蠢|世界快看
理想汽车:几万块营销预算李想亲自批 但安全方面预算不需要
关于Kubernetes-v1.23.6-初始化时报错[kubelet-check] It seems like the kubelet isn't runni
编程题库 - 基本运算 - 整数运算求两个整数相加之和
零营收药企密集IPO 估值成关注点
天天看点:iPhone 15 Pro Max机模上手:1.57mm超窄边框、Type-C接口
对于女大学生 一晚上最少多少钱
一夜爆红 湖北黄老师直播唱挖呀挖打赏不断 律师:或涉嫌侵权
每日关注!夏天必备 润本蚊香液3瓶+1器大促:到手14.9元
254TOPS算力!比亚迪新一代王朝、海洋系列要用NVIDIA Drive Orin芯片-天天快报
前沿热点:Win11精简版系统成功安装在4GB显存中:运行速度飞快!
微头条丨炉慈高速全线首座隧道双线提前贯通
【环球时快讯】侵害用户权益!工信部通报56款App:羊了个羊上榜
焦点快报!巴菲特股东大会!巴菲特:我们的火车还停留在19世纪末水平
学系统集成项目管理工程师(中项)系列18b_进度管理(下)-当前动态
世界快报:关于俞敏洪建议24节气都放假及俞敏洪建议24节气都放假详情
2、etcd单机部署和集群部署
网友逛鱼店惊喜偶遇鲨鱼产子过程:第一次见 很神奇
深圳一公司发布年薪50万岗位:优先录用李一桐粉丝
7人吃自助炫300多个螃蟹 医生:过量食用螃蟹或引发多种疾病|世界时讯
苹果别对iPhone 15 USB-C限速!不然欧盟不答应
加快摆脱中国供应链?库克:苹果接下来就靠印度了
什么是成本性态 什么是成本|世界热讯
爱成都迎大运宣传稿怎么画(爱成都迎大运宣传句)
咖啡色地板配什么颜色家具_咖啡色配什么颜色好看
网站被攻击了!!! 速递
老人推倒摩托车案执行款1.6万已到账 车主10个月维权结束:老人违法不该被宽恕
天天百事通!民呼我应|东门一市政路被“霸占”,官方回应来了
【环球新要闻】月嫂拍嗝时打盹致婴儿头顶骨骨折 平台:愿退还未完成的服务费
“挖呀挖呀挖”童谣为何火爆全网?专家解释原因_天天速看
全球今日报丨冷冻小龙虾怎么加热 冷冻小龙虾怎么加热才好吃
美股银行股周五为何大涨?没有空头想持仓过周末
天天速讯:中国特供 NVIDIA缩水版A800显卡遭哄抢:10万元也难买到
“投资界的春晚”要来了:巴菲特股东大会五大看点_世界微动态
老黄良心了 5000块的4060游戏本值得买吗?结论来了
复数的基本知识
最新快讯!关于学生五一前请假遭拒强行离校被处分及学生五一前请假遭拒强行离校被处分详情
广东小区业主私拆承重墙 多户搬离墙体开裂到14楼:网友吐槽是谋杀 希望严惩
5月价格继续涨 LCD面板不再亏本卖:75寸电视不到3000元
快播:“土味”出圈!济宁“90后”唢呐女博士背后的故事
最新消息:SQL 解析在 CloudQuery 中的应用
小红书布局AI大模型:上线AI绘画应用
旅客问路被工作人员怼回去多读书 车站回应:严肃处理|环球微速讯
天天视讯!航拍安徽岳西茭白田:满眼葱绿孕育生机
世界热点评!C#高级编程--反射与特性
88年后入土为安 云南禄劝隆重安葬21具红军烈士遗骸
新消息丨厂商为何要封杀32位APP?真实原因揭开
比商超便宜一半多!伊利巧乐兹大促:券后每支2.4元起
3090 Ti能抵7200元 iGame以旧换新7日开启:RTX 40显卡这下真的便宜了 天天视讯