C# 知识回想 –  体系化

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

目录

 

① 、类别化的含义

  体系化
(Serialization)将对象的状态信息处理为字节流,以便于储存或传输到内部存款和储蓄器、数据库或文件的一个经过。在种类化时期,对象将其近来景况写入到一时或持久性存款和储蓄区,首要目标是保存对象的动静。便于日后从该景况中进行还原,成立新的目的,那个进度又称作反种类化。

 

1.1 体系化的做事办法

XML 1

图1.1-1

 

XML 2

  对象被系列化为字节流(包罗数据、对象的类型新闻:如版本、区域性和次序集名称)
–> 存款和储蓄到 DB、IO 等地点。

 

1.2 用于系列化

  大家在数据调换的时候常进行系列化保存对象的数据消息,在需求选取它的时候再展开反系列化重新读取对象的音讯并拓展校验和仓库储存的片段做事。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
实行剖析处理)。

 

1.3 使对象可类别化

  进行系列化的操作,需求:三个带类别化的靶子,二个是包括体系化对象的流和二个连串化器(Formatter)。

  我们开始展览编写制定的类中,暗中认可会给类拉长 SerializableAttribute 天性的,当然你也得以选择显式的章程开始展览添加。当你打算对二个对象进行连串化时,要是它不带有 SerializableAttribute,将会吸引那些。在一些时候,大家恐怕不指望类中的有些字段或性质举行连串化操作,你能够在该字段或品质上运用 NonSerializedAttribute ,以告知种类化器不对它们进行系列化操作。

 

  【备注】假使已连串化的类中带有了别样类对象的引用,而这几个类又恰恰也有
SerializableAttribute,那么它们也会被开始展览类别化。

  【备注】种类化的重庆大学字性子:SerializableAttributeNonSerializedAttribute

 

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

  (1)二进制系列化:使用二进制编码来变化精简的系列化,会连串化全数成员,并进步质量。常用于存款和储蓄和
socket 传输。

  (2)XML
类别化:可读性更高,也就表示有更高的一箭穿心,操作的便利性。可用 XmlSerializer 举办种类化操作。

 

 


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

  这里运用
demo 举行简要演示怎么着对指标进行体系化和反类别化操作。

 

2.1 使用类别化保存对象

XML 3XML 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         }

XML 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         }

XML 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         }

XML 7

图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<> 二13个字符,假使目的非常的大会浪费一部分流量,建议使用
DataContractAttribute 和 DataMemberAttribute

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

 

 


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

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

 

相关文章

网站地图xml地图