[C#] C# 知识回看 – 系列化

C# 知识回看 –  体系化

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

目录

 

一、连串化的意思

  种类化
(Serialization)将对象的景观音讯处理为字节流,以便于储存或传输到内存、数据库或文件的一个进度。在体系化时期,对象将其日前情状写入到权且或持久性存储区,紧要目的是保留对象的情事。便于日后从这场馆中举办復苏,创立新的对象,这些进度又称为反连串化。

 

1.1 种类化的干活章程

图片 1

图1.1-1

 

图片 2

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

 

1.2 用于体系化

  大家在数据交流的时候常进行种类化保存对象的数量新闻,在要求使用它的时候再拓展反连串化重新读取对象的消息并进行校验和存储的片段办事。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举办剖析处理)。

 

1.3 使对象可种类化

  进行系列化的操作,须要:多个带连串化的靶子,3个是带有体系化对象的流和二个系列化器(Formatter)。

  大家举办编制的类中,默许会给类增加 SerializableAttribute 本性的,当然你也得以行使显式的法门开展添加。当你打算对3个对象举行体系化时,如若它不分包 SerializableAttribute,将会引发那二个。在有个别时候,大家可能不期望类中的有个别字段或性质进行系列化操作,你能够在该字段或品质上应用 NonSerializedAttribute ,以告知系列化器不对它们举行种类化操作。

 

  【备注】假使已种类化的类中隐含了任何类对象的引用,而那几个类又凑巧也有
SerializableAttribute,那么它们也会被开展种类化。

  【备注】种类化的严重性字天性:SerializableAttributeNonSerializedAttribute

 

  那里介绍一种普遍的种类化和一种不常见的体系化:

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

  (2)XML
种类化:可读性更高,也就表示有更高的八面见光,操作的便利性。可用 XmlSerializer 举行体系化操作。

 

 


二、通过体系化保存对象数据

  那里运用
demo 进行简单演示怎么样对目的开展系列化和反种类化操作。

 

2.1 使用系列化保存对象

图片 3图片 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         }

图片 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         }

图片 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         }

图片 7

图2-3

  反连串化时也利用 SoapFormatter 即可,结果同图2-2。

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

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

  【备注】二进制格式对于多数
Windows 应用程序均适用。对于在此此前来说,使用
Web 应用程序或然是 Web 服务,提出拔取 SOAP 的 XML
进行传输。而近年来,当然是接纳丰田(Toyota)化的 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

【参考】微软官方文档

 

相关文章