[C#] C# 知识回顾 - 序列化
C# 知识回顾 - 序列化
【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5902005.html
目录
一、序列化的含义
序列化 (Serialization)将对象的状态信息处理为字节流,以便于存储或传输到内存、数据库或文件的一个过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区,主要目的是保存对象的状态。便于日后从该状态中进行还原,创建新的对象,这个过程又称为反序列化。
1.1 序列化的工作方式
图1.1-1

1.2 用于序列化
1.3 使对象可序列化
这里介绍一种常见的序列化和一种不常见的序列化:
(1)二进制序列化:使用二进制编码来生成精简的序列化,会序列化所有成员,并提高性能。常用于存储和 socket 传输。
(2)XML 序列化:可读性更高,也就表示有更高的灵活性,操作的便利性。可用 XmlSerializer 进行序列化操作。
二、通过序列化保存对象数据
这里使用 demo 进行简单演示如何对对象进行序列化和反序列化操作。
2.1 使用序列化保存对象
[Serializable] //将类标记为可序列化
public class Coupon : INotifyPropertyChanged
{
public decimal Amount { get; set; } public float InterestRate { get; set; } public int Term { get; set; } private string _name; public string Name
{
get { return _name; }
set
{
_name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer"));
}
} [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化
public event PropertyChangedEventHandler PropertyChanged; public Coupon(decimal amount, float interestRate, int term, string name)
{
Amount = amount;
InterestRate = interestRate;
Term = term;
_name = name;
}
}
Coupon.cs
static void Main(string[] args)
{
const string fileName = @"demo1.txt";
var coupon = new Coupon(, 0.2f, , "反骨仔"); using (var stream = File.Create(fileName))
{
var deserializer = new BinaryFormatter(); //二进制格式序列化器
deserializer.Serialize(stream, coupon); //序列化对象到文件中
}
}

图2-1
现在尝试反序列化,看看与之前 Coupon 对象的值是否一致。
static void Main(string[] args)
{
const string fileName = @"demo1.txt";
//var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); //判断该文件是否存在
if (!File.Exists(fileName))
{
return;
} using (var stream = File.OpenRead(fileName))
{
var deserializer = new BinaryFormatter(); //二进制序列化器
var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化 if (coupon == null)
{
return;
} Console.WriteLine($"{nameof(Coupon)}:");
Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}");
Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%");
Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}");
Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}");
} Console.Read();
}

图2-2
2.2 使用 SOAP 格式保存对象
static void Main(string[] args)
{
const string fileName = @"demo1.txt";
var coupon = new Coupon(, 0.2f, , "反骨仔"); using (var stream = File.Create(fileName))
{
var deserializer = new SoapFormatter(); //Soap 格式化器
deserializer.Serialize(stream, coupon); //序列化
}
}

图2-3
反序列化时也采用 SoapFormatter 即可,结果同图2-2。
var deserializer = new SoapFormatter(); //Soap 格式化器
var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
【注意】不应将这些格式用于敏感数据,如密码或信用卡信息。
【备注】二进制格式对于大多数 Windows 应用程序均适用。对于以前来说,使用 Web 应用程序或者是 Web 服务,建议使用 SOAP 的 XML 进行传输。而现在,当然是使用大众化的 json 格式进行传输啦。
同样,也可以通过 XmlSerializer 将对象序列化保存在 XML 文件。我们可以根据需求选择合适的序列化器,操作基本是一样的。
众说纷纭
@hi丶小时候 使用 SerializableAttribute 特性时,是不建议使用自动属性的,序列化后的字段都是多出 k_BackingField<> 17个字符,如果对象很大会浪费一部分流量,建议使用 DataContractAttribute 和 DataMemberAttribute
@梁逸晨 除非对方系统强制要求 SOAP 才能通信,否则该人人抵制这么反人类的东西,建议楼主 JSON 或 Protobuf
【参考】https://msdn.microsoft.com/zh-cn/subscriptions/ms233843(v=vs.100).aspx
【参考】微软官方文档
[C#] C# 知识回顾 - 序列化的更多相关文章
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
随机推荐
- IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题
你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时,IE 6.7.8.9下都跑的好好的,唯独到了IE10.11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次.那么,我们 ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
- .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍
1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- wordpress优化之结合prism.js为编辑器自定义按钮转化代码
原文链接 http://ymblog.net/2016/07/24/wordpress-prism/ 继昨天花了一天一夜的时间匆匆写了主题Jiameil3.0之后,心中一直在想着优化加速,体验更好,插 ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- 中国CIO最关心的八大问题(下)
中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...
- Android—基于GifView显示gif动态图片
android中显示gif动态图片用到了开源框架GifView 1.拷GifView.jar到自己的项目中. 2.将自己的gif图片拷贝到drawable文件夹 3.在xml文件中设置基本属性: &l ...