C# 知识回想 –  种类化

 【博主】反骨仔    【原著地址】http://www.cnblogs.com/liqingwen/p/5902005.html

目录

 

① 、体系化的意思

  体系化
(Serialization)将指标的意况音信处理为字节流,以便于储存或传输到内部存款和储蓄器、数据库或文件的一个经过。在系列化时期,对象将其眼下状态写入到一时或持久性存款和储蓄区,首要指标是保留对象的情况。便于日后从该情形中开展复原,创建新的靶子,这些历程又称之为反体系化。

 

1.1 连串化的办事办法

json 1

图1.1-1

 

json 2

  对象被类别化为字节流(包含数据、对象的类型消息:如版本、区域性和顺序集名称)
–> 存款和储蓄到 DB、IO 等地点。

 

1.2 用于体系化

  大家在数据沟通的时候常举行体系化保存对象的数据音讯,在急需选择它的时候再展开反类别化重新读取对象的音信并拓展校验和仓储的片段办事。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举办剖析处理)。

 

1.3 使对象可类别化

  进行种类化的操作,必要:一个带种类化的指标,三个是带有类别化对象的流和二个种类化器(Formatter)。

  大家举行编辑的类中,暗许会给类增长 SerializableAttribute 个性的,当然你也能够运用显式的情势开始展览添加。当您打算对2个对象举办类别化时,假使它不分包 SerializableAttribute,将会掀起那2个。在有个别时候,大家大概不指望类中的有个别字段或性质进行类别化操作,你能够在该字段或品质上选拔 NonSerializedAttribute ,以告知种类化器不对它们实行体系化操作。

 

  【备注】假如已体系化的类中包罗了任何类对象的引用,而那么些类又凑巧也有
SerializableAttribute,那么它们也会被开始展览连串化。

  【备注】系列化的首要字脾气:SerializableAttributeNonSerializedAttribute

 

  那里介绍一种普遍的系列化和一种不广泛的类别化:

  (1)二进制体系化:使用二进制编码来扭转精简的连串化,会种类化全数成员,并增强质量。常用来存款和储蓄和
socket 传输。

  (2)XML
系列化:可读性更高,也就代表有更高的灵活性,操作的便利性。可用 XmlSerializer 进行连串化操作。

 

 


二 、通过连串化保存对象数据

  那里运用
demo 举行简易演示怎样对目的开始展览系列化和反系列化操作。

 

2.1 使用类别化保存对象

json 3json 4

 1     [Serializable]  //将类标记为可序列化
 2     public class Coupon : INotifyPropertyChanged
 3     {
 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     }

Coupon.cs

 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         }

json 5

图2-1 

 

  今后尝试反体系化,看看与事先 Coupon 对象的值是或不是同样。

 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         }

json 6

图2-2

 

2.2 使用 SOAP 格式保存对象

 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         }

json 7

图2-3

  反系列化时也运用 SoapFormatter 即可,结果同图2-2。

                var deserializer = new SoapFormatter();   //Soap 格式化器
                var coupon = deserializer.Deserialize(stream) as Coupon;    //反序列化

  【注意】不应将这个格式用中国“氢弹之父”感数据,如密码或信用卡信息。

  【备注】二进制格式对于绝抢先56%Windows 应用程序均适用。对于此前来说,使用
Web 应用程序也许是 Web 服务,提议利用 SOAP 的 XML
进行传输。而现行反革命,当然是运用Chevrolet化的 json
格式进行传输啦。

 

  同样,也足以由此 XmlSerializer 将指标系列化保存在
XML 文件。我们能够依据供给采取适用的类别化器,操作基本是平等的。

 

议论纷纷

  @hi丶小时候 使用
SerializableAttribute
性格时,是不建议接纳电动属性的,种类化后的字段都以多出
k_BackingField<> 1多个字符,假设目的极大会浪费一部分流量,建议使用
DataContractAttribute 和 DataMemberAttribute

  @梁逸晨 除非对方系统强制供给 SOAP
才能通讯,不然该人人抵制那样反人类的事物,建议楼主 JSON 或 Protobuf

 

 


【参考】https://msdn.microsoft.com/zh-cn/subscriptions/ms233843(v=vs.100).aspx

【参考】微软官方文书档案

 

相关文章

网站地图xml地图