只是想简单说下序列化
【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html
目录
- 序列化的含义
- 通过序列化保存对象数据
- 众说纷纭
一、序列化的含义
1.1 序列化的工作方式
![](/assets/blank.gif)
图1.1-1
1.2 用于序列化
1.3 使对象可序列化
1.3.1 二进制序列化和 XML 序列化
1.3.2 二进制序列化
1.3.3 XML 序列化
1.3.4 SOAP 序列化
1.3.5 基本序列化和自定义序列化
1.3.5.1 基本序列化
基本序列化的唯一要求是对象必须应用 SerializableAttribute 特性。 NonSerializedAttribute 可用于禁止序列化特定字段。
1.3.5.2 自定义序列化
1.3.6 设计器序列化
二、通过序列化保存对象数据
2.1 使用序列化保存对象
![](/assets/blank.gif)
![](/assets/blank.gif)
1 [Serializable] //将类标记为可序列化2 public class Coupon : INotifyPropertyChanged3 {4 public decimal Amount { get; set; }5 6 public float InterestRate { get; set; }7 8 public int Term { get; set; }9 10 private string _name; 11 12 public string Name 13 { 14 get { return _name; } 15 set 16 { 17 _name = value; 18 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer")); 19 } 20 } 21 22 [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化 23 public event PropertyChangedEventHandler PropertyChanged; 24 25 public Coupon(decimal amount, float interestRate, int term, string name) 26 { 27 Amount = amount; 28 InterestRate = interestRate; 29 Term = term; 30 _name = name; 31 } 32 }
![](/assets/blank.gif)
![](/assets/blank.gif)
1 static void Main(string[] args)2 {3 const string fileName = @"demo1.txt";4 var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");5 6 using (var stream = File.Create(fileName))7 {8 var deserializer = new BinaryFormatter(); //二进制格式序列化器9 deserializer.Serialize(stream, coupon); //序列化对象到文件中 10 } 11 }
![](/assets/blank.gif)
![](/assets/blank.gif)
图2-1
现在尝试反序列化,看看与之前 Coupon 对象的值是否一致。
![](/assets/blank.gif)
1 static void Main(string[] args)2 {3 const string fileName = @"demo1.txt";4 //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");5 6 //判断该文件是否存在7 if (!File.Exists(fileName))8 {9 return; 10 } 11 12 using (var stream = File.OpenRead(fileName)) 13 { 14 var deserializer = new BinaryFormatter(); //二进制序列化器 15 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化 16 17 if (coupon == null) 18 { 19 return; 20 } 21 22 Console.WriteLine($"{nameof(Coupon)}:"); 23 Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}"); 24 Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%"); 25 Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}"); 26 Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}"); 27 } 28 29 Console.Read(); 30 }
![](/assets/blank.gif)
图2-2
2.2 使用 SOAP 格式保存对象
![](/assets/blank.gif)
1 static void Main(string[] args)2 {3 const string fileName = @"demo1.txt";4 var coupon = new Coupon(10000, 0.2f, 1, "反骨仔");5 6 using (var stream = File.Create(fileName))7 {8 var deserializer = new SoapFormatter(); //Soap 格式化器9 deserializer.Serialize(stream, coupon); //序列化 10 } 11 }
![](/assets/blank.gif)
图2-3
反序列化时也采用 SoapFormatter 即可,结果同图2-2。
var deserializer = new SoapFormatter(); //Soap 格式化器var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
【注意】本示例将数据存储到二进制或 SOAP 格式的文件中。不应将这些格式用于敏感数据,如密码或信用卡信息。
【备注】二进制格式对于大多数 Windows 应用程序均适用。但对于 Web 应用程序或 Web 服务,您可能希望使用 SOAP 格式将对象保存到 XML 文件中,以使对象易于共享。
同样,也可以通过 XmlSerializer 将对象序列化保存在 XML 文件。我们可以根据需求选择合适的序列化器,操作基本是一样的。
众说纷纭
@hi丶小时候 使用 SerializableAttribute 特性时,是不建议使用自动属性的,序列化后的字段都是多出 k_BackingField<> 17个字符,如果对象很大会浪费一部分流量,建议使用 DataContractAttribute 和 DataMemberAttribute
@梁逸晨 除非对方系统强制要求 SOAP 才能通信,否则该人人抵制这么反人类的东西,建议楼主 JSON 或 Protobuf
转载于:https://www.cnblogs.com/zhangxiaolei521/p/5913834.html
只是想简单说下序列化相关推荐
- CVer最想知道的,简单分析下《2020年度中国计算机视觉人才调研报告》
文章首发于CVer最想知道的,简单分析下<2020年度中国计算机视觉人才调研报告> 最近闲来无事,老潘以一名普通算法工程师的角度,结合自身以及周围人的情况,理性也感性地分析一下极市平台前些 ...
- 简单介绍下微信群大全500人大群及免费微信互投群万人群
简单介绍下微信群大全500人大群及免费微信互投群万人群 当前很多微信投票活动慢慢变多,许多人在网上寻找关于"微信群大全500人大群及免费微信互投群万人群"来自己拉票,那么网上那么多 ...
- 工作篇 之 简单聊下有关环信的 “坑” ...
LZ-Says:相遇,相知,相恋,争执,平淡,压抑,愤懑,该画上句号了. 前言 环信,Enmmm,牛逼,懵 ing -! 最近这段时间一直围绕环信,在使用的过程中,遇到很多很多问题,自己都感觉蒙圈,烦 ...
- 简单说下YOLOv1、v2、v3、v4各自的特点与发展史
文章目录 一.任务描述 二.设计思想 三.发展历程 YOLOv1 YOLOv2 YOLOv3 YOLOv4 四.总结 一.任务描述 目标检测是为了解决图像里的物体是什么,在哪里的问题.输入一幅图像,输 ...
- 简单盘点下22年第一季度一直坚持的五件小事
稻盛和夫说:总有一天,你会明白, 真正能够治愈你的,从来都不是时间, 而是你心里的那段释怀和格局, 只要你内心不慌乱. 工作上会有Q1绩效,那生活上也可以有哈哈哈 今天周末,上午去弄了核酸,逛了家附近 ...
- java 序列化 例子_一个简单的Java序列化的例子
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对 ...
- 简单记录下换了华为 HS8145V5 modem 路由器
简单记录下换了华为 HS8145V5 准备 本体 性能 结尾 深圳移动宽带,带宽不知道(家人办的),换了住宅后放 modem 位置太偏,送的 HG260GS-U 跑不动.这俩货都是调制解调器和无线路由 ...
- 简单了解下linux与windows两者的区别-行云管家
为了让新入门的小伙伴快速了解linux系统.windows系统相关知识,我们小编为大家简单整理了linux与windows两者的区别,希望能加深大家的了解. 简单了解下linux与windows两者的 ...
- Example017简单的下拉框
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
最新文章
- tomcat与iis公用80端口(已经发布.net项目现在开发Java项目时tomcat在eclipse中localhost:8080打不开问题)...
- c# point偏移_.NET 在图片上写文字出现偏移的解决
- 【TDS学习文档4】IBM Directory schema的管理2——object class
- Android中实现Launcher功能之四---滑屏初探 scrollTo 以及 scrollBy方法使用说明
- 使用光标查询10部门的员工姓名和工资,并打印__使用光标查询员工姓名和工资,并打印
- Vue CLI 3.0脚手架如何在本地配置mock数据json
- HBase1.0.0 实现数据增删查
- Redis-cluster集群【第一篇】:redis安装及redis数据类型
- 禁止访问磁盘的注册表
- Linux基础笔记1
- .Net 下信号量(Semaphore)的一种实现
- flink Table API 与SQL入门实战
- Weex中页面导航的实现
- Http第三方接口实现/异步Http请求
- Swift 使用SwiftyJSON解析JSON数据
- 【盘点】2018最受欢迎的网页设计软件集合!
- 使用katana-parser解析css文件
- Android开发-窗口跳转
- ag-grid with web api
- 剑灵南天国服务器位置,剑灵南天国实验室商城说明及FAQ
热门文章
- 乔巴机器人 番外篇_乔巴超级机器人系列 篇二:乔巴超级机器人三号四号五号拼装及合体...
- Job in state RUNNING instead of DEFINE
- Eureka参数配置项
- 王珊数据库系统概论第5版教材精讲考研真题串讲视频
- 范仲淹促进经济发展的办法
- 启动VMware虚拟机显示:物理内存不足无法使用的五种解决方法
- IMSI与MSISDN
- 智能家居设计新生态 “小Home Assistant” 智汀一站式全屋智能解决方案
- 福利 | 今天带你们走进女程序员
- Cloud Foundry 3. cf 命令