威尼斯人线上娱乐

知识回想,的二种类别化方法

27 4月 , 2019  

C# 知识回看 –  种类化

 【博主】反骨仔    【原来的书文地址】

C# 知识回看 –  类别化

 【博主】反骨仔    【原来的小说地址】

[C#] 说说体系化,

体系化是将一个指标调换到字节流以达到将其漫长保存在内部存储器、数据库或文件中的管理进程。它的显要指标是保留对象的气象以便未来需求的时候使用。与其相反的进程叫做反系列化。

目录

  • 种类化的意义
  • 因此种类化保存对象数据
  • 商酌纷繁

 

知识回想,的二种类别化方法。目录

  • 系列化的含义
  • 通过种类化保存对象数据
  • 评论纷繁

 

说说种类化

 【博主】反骨仔    【最初的作品地址】

体系化2个目的

为了体系化一个目的,我们须求贰个被系列化的对象,几个容纳被体系化了的目标的(字节)流和3个格式化器。举办体系化以前大家先看看System.Runtime.Serialization名字空间。ISerializable接口允许大家使别的类成为可连串化的类。

若果大家给和谐写的类标记[Serializable]特点,大家就能将那几个类系列化。除非类的积极分子标志了[NonSerializable],系列化会将类中的全数成员都种类化。

系列化的体系

  • 二进制(流)序列化
  • SOAP序列化
  • XML序列化

二进制(流)序列化:

二进制(流)序列化是一种将数据写到输出流,以使它能够用来机关重构成相应对象的体制。2进制,其名字就暗中表示它的必需音讯是保存在存储介质上,而那一个不可或缺消息须要创建2个目标的正确的贰进制别本。在2进制(流)体系化中,整个对象的情事都被保存起来,而XML连串化只有部分数据被保存起来。为了利用体系化,我们须要引进System.Runtime.Serialization.Formatters.Binary名字空间.
上面包车型地铁代码应用BinaryFormatter类类别化.NET中的string类型的目标。

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace SerializationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object          
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, strobj);
            stream.Close();

            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)formatter.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();

        }
    }
}

SOAP序列化:

SOAP共谋是一个在异构的应用程序之间张开消息交互的美观的取舍。大家必要在应用程序中增添System.Runtime.Serialization.Formatters.Soap名字空间以便在.Net中选用SOAP序列化SOAP序列化的基本点优势在于可移植性。SoapFormatter把目标连串化成SOAP音信或分析SOAP音信人己一视构被类别化的对象。上面包车型的士代码在.Net中运用SoapFormatter类类别化string类的对象。

using System; 
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap ;

namespace SerializationTest
 {
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object            
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            SoapFormatter formatter = new SoapFormatter();
            formatter.Serialize(stream, strobj);
            stream.Close();
            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)formatter.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();
        }
    }
}

XML序列化:

根据MSDN的描述,“XML序列化将2个目的或参数的当众字段和质量以及艺术的再次回到值调换(类别化)成遵守XSD文书档案规范的XML流。因为XML是3个盛开的正儿捌经,XML能被别的供给的程序管理,而任由在怎么着平台下,因此XML类别化被用到含有公开的天性和字段的强类型类中,它的这么些产生和字段被转变来类别化的格式(在此间是XML)存款和储蓄或传输。”

我们不能够不抬高System.XML.Serialization引用以应用XML序列化。使用XML序列化的基础是XmlSerializer。下边包车型客车代码是在.Net中动用XmlSerializer类种类化string对象。

using System;
using System.IO;
using System.Xml.Serialization;


namespace SerializationTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //Serialization of String Object            
            string strobj = "test string for serialization";
            FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
            FileShare.None);
            XmlSerializer  xmlserializer = new XmlSerializer(typeof(string));
            xmlserializer.Serialize(stream, strobj);
            stream.Close();


            //Deserialization of String Object
            FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
            FileShare.Read );
            string readdata = (string)xmlserializer.Deserialize(readstream);
            readstream.Close();
            Console.WriteLine(readdata);
            Console.ReadLine();


        }
    }
}

什么是格式化器?

一个格式化器用来分明二个目的的连串格式。它们目的是在互联网上传输3个指标从前将其种类化成合适的格式。它们提供IFormatter接口。在.NET里提供了四个格式化类:BinaryFormatterSoapFormatter,它们都连任了IFormatter接口。

行使种类化

系列化允许开荒职员保存一个对象的景色并在急需的时候重构对象,同时很好地补助对象存款和储蓄和数据调换。通过类别化,开采人士能够使用Web
Service发送对象到远端应用程序,从1个域传输对象到另五个域,以XML的格式传输一个对象并能通过防火墙,或许在应用程序间保证安全性或用户特定消息等等。

正文中的全数译文仅用于学习和调换目标,转发请务必注脚文章译者、出处、和本文链接
大家的翻译工作遵照 CC
协议,要是大家的行事有入侵到您的变通,请立时联系我们

 

一、类别化的意思

  连串化
(Serialization)将目的的场地新闻处理为字节流,以便于储存或传输到内部存款和储蓄器、数据库或文件的一个经过。在系列化时期,对象将其日前气象写入到权且或持久性存款和储蓄区,主要目标是保留对象的景况。便于日后从该意况中开展复原,创立新的靶子,那么些进度又叫做反体系化。

 

一、连串化的意义

  体系化
(Serialization)将对象的事态音讯管理为字节流,以便于积攒或传输到内部存款和储蓄器、数据库或文件的2个进度。在系列化期间,对象将其目前处境写入到一时或持久性存款和储蓄区,主要目标是保留对象的动静。便于日后从该意况中举办还原,成立新的目的,这几个进程又称之为反系列化。

 

1.一 类别化的劳作措施

威尼斯人线上娱乐 1

图1.1-1

 

威尼斯人线上娱乐 2

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

 

1.1 类别化的干活方法

威尼斯人线上娱乐 3

图1.1-1

 

威尼斯人线上娱乐 4

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

 

目录

  • 序列化
  • 封存对象数据

 

壹.二 用于种类化

  大家在数据沟通的时候常举行体系化保存对象的数额音信,在急需运用它的时候再实行反体系化重新读取对象的音信并开始展览校验和存款和储蓄的1对专门的学业。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举办分析管理)。

 

1.二 用于种类化

  大家在数据交换的时候常进行种类化保存对象的数量音讯,在急需运用它的时候再打开反类别化重新读取对象的新闻并拓展校验和存款和储蓄的部分办事。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
进行剖析管理)。

 

一、序列化

  种类化是将指标管理为字节流以存款和储蓄对象或传输到内部存款和储蓄器、数据库或文件。其利害攸关目标是保留对象的意况,以便能够在须求时再一次成立对象。相反的进度称为反类别化。
 

1.三 使对象可类别化

  实行系列化的操作,须求:二个带种类化的靶子,1个是带有系列化对象的流和一个体系化器(Formatter)。

  大家进行编辑的类中,默许会给类增加 SerializableAttribute 天性的,当然你也足以行使显式的章程进行增添。当你准备对多个目的开始展览体系化时,要是它不分包 SerializableAttribute,将会迷惑那些。在少数时候,大家恐怕不希望类中的有个别字段或质量进行系列化操作,你能够在该字段或质量上应用 NonSerializedAttribute ,以告知系列化器不对它们举办体系化操作。

 

  【备注】借使已系列化的类中富含了任何类对象的引用,而那几个类又凑巧也有
SerializableAttribute,那么它们也会被开始展览类别化。

  【备注】连串化的主要性字天性:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍1种常见的种类化和一种不广泛的连串化:

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

  (贰)XML
体系化:可读性更加高,也就意味着有越来越高的狡滑,操作的便利性。可用 XmlSerializer 进行连串化操作。

威尼斯人线上娱乐, 

 


一.③ 使对象可体系化

  进行系列化的操作,供给:3个带连串化的目的,八个是含有种类化对象的流和四个体系化器(Formatter)。

  大家进行编辑的类中,默许会给类增加 SerializableAttribute 特性的,当然你也得以接纳显式的点子展开增加。当你打算对二个目的开始展览种类化时,如若它不含有 SerializableAttribute,将会掀起那多少个。在有些时候,大家可能不指望类中的有些字段或性质进行体系化操作,你能够在该字段或性质上应用 NonSerializedAttribute ,以报告种类化器不对它们举行系列化操作。

 

  【备注】尽管已连串化的类中富含了别的类对象的引用,而那么些类又刚好也有
SerializableAttribute,那么它们也会被进行系列化。

  【备注】类别化的第三字天性:SerializableAttribute、NonSerializedAttribute。

 

  这里介绍一种遍布的连串化和壹种不普及的系列化:

  (1)2进制种类化:使用二进制编码来变化精简的种类化,会体系化全体成员,并升高品质。常用于存款和储蓄和
socket 传输。

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

 

 


一.1 类别化的劳作格局

  此图体现类别化的整套经过。 图壹.一-壹

  威尼斯人线上娱乐 5
  对象被系列化为流。流传递的不仅仅是数额,还包括关于对象类型的音讯,如目的的本子、区域性和程序集名称。通过该流,能够将对象存储在数据库、文件或内部存款和储蓄器中。

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

  那里运用
demo 进行简易演示怎么样对目的进行类别化和反体系化操作。

 

2、通过系列化保存对象数据

  那里运用
demo 实行简短演示怎么着对目的开始展览体系化和反连串化操作。

 

壹.贰 用于体系化

  通过连串化,开采人士能够保留对象的情状,并在供给时再也创造该对象,从而提供对象的积累以及数据调换。通过种类化,开采职员还足以实行类似如下的操作:通过
Web 服务将目的发送到远程应用程序、将目标从1个域传递到另一个域、以 XML
字符串的花样跨防火墙传递对象,或然跨应用程序维护安全新闻或用户特定音信。

贰.一 使用系列化保存对象

威尼斯人线上娱乐 6威尼斯人线上娱乐 7

 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         }

威尼斯人线上娱乐 8

图2-1 

 

  今后尝试反类别化,看看与事先 Coupon 对象的值是或不是1致。

 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         }

威尼斯人线上娱乐 9

图2-2

 

二.一 使用体系化保存对象

威尼斯人线上娱乐 10威尼斯人线上娱乐 11

 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         }

威尼斯人线上娱乐 12

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

威尼斯人线上娱乐 13

图2-2

 

一.三 使对象可类别化

  若要体系化对象,您必要待体系化的目的、要含有系列化对象的流,以及2个 Formatter。 System.Runtime.Serialization包涵连串化和反系列化对象所需的类。
  将 SerializableAttribute 天性应用于二个种类可提醒该项目标实例能够系列化。尝试连串化时,若是类型未有 SerializableAttribute 特性,将引发SerializationException 分外。
  倘若不指望类中的字段可种类化,请应用 NonSerializedAttribute 特性。假如可种类化类型的字段包涵指针、句柄或其它一些专用于特定情状的数据结构,并且无法在不相同的条件中以有含义的艺术重建,则恐怕需求使该字段不可类别化。
  借使已类别化的类富含对标识为 SerializableAttribute 的别的类的对象的引用,则也将种类化那些目的。

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         }

威尼斯人线上娱乐 14

图2-3

  反种类化时也运用 SoapFormatter 就能够,结果同图二-2。

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

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

  【备注】2进制格式对于超过五分之三Windows 应用程序均适用。对于在此之前来讲,使用
Web 应用程序恐怕是 Web 服务,建议使用 SOAP 的 XML
举办传输。而近日,当然是接纳大众化的 json
格式实行传输啦。

 

  同样,也可以经过 XmlSerializer 将目标连串化保存在
XML 文件。大家得以依据须要选取适当的连串化器,操作基本是同样的。

 

二.二 使用 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         }

威尼斯人线上娱乐 15

图2-3

  反体系化时也选取 SoapFormatter 就能够,结果同图二-2。

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

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

  【备注】2进制格式对于绝大繁多Windows 应用程序均适用。对于之前来讲,使用
Web 应用程序可能是 Web 服务,提出利用 SOAP 的 XML
进行传输。而现在,当然是使用大众化的 json
格式实行传输啦。

 

  一样,也足以因而 XmlSerializer 将对象种类化保存在
XML 文件。大家得以依靠需要选用非常的连串化器,操作基本是一模一样的。

 

一.3.1 2进制种类化和 XML 类别化

  可以应用二进制连串化或 XML
连串化。在贰进制体系化中,会种类化全体成员(以至席卷那多少个只读成员),从而得以升高品质。XML
类别化提供了可读性更加好的代码,并在目标共享和行使方面提供了更加大的八面驶风,以便完毕互操作性。

研讨纷纭

  @hi丶小时候 使用
SerializableAttribute
天性时,是不提出采取机关属性的,连串化后的字段都以多出
k_BackingField<> 1九个字符,要是目的相当的大会浪费一部分流量,建议使用
DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

商酌纷繁

  @hi丶小时候 使用
SerializableAttribute
天性时,是不建议采纳电动属性的,类别化后的字段都是多出
k_BackingField<> 一九个字符,若是目的相当大会浪费1部分流量,建议利用
DataContractAttribute 和 DataMemberAttribute

  @梁逸晨 除非对方系统强制须求 SOAP
技巧通讯,不然该人人抵制那样反人类的事物,提出楼主 JSON 或 Protobuf

 

 


【参考】

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

 

一.三.2 二进制体系化

  二进制体系化使用贰进制编码来扭转精简的类别化,以用来存款和储蓄或基于套接字的网络流等。

1.3.3 XML 序列化

  XML
体系化将目的的共用字段和天性只怕措施的参数及重回值类别化为符合一定 XML
架构定义语言 (XSD) 文书档案的 XML 流。XML 连串化会变卦具备转变为 XML
的公物属性和字段的强类型类。 System.Xml.Serialization 包括类别化和反系列化
XML 所需的类。
  您可以将特色应用于类和类成员,以决定 XmlSerializer 体系化或反类别化类实例的办法。

1.3.4 SOAP 序列化

  XML 体系化还可用来将对象连串化为符合 SOAP 标准的 XML 流。SOAP
是壹种基于 XML 的商酌,它是特地为运用 XML
来传输进度调用而规划的。就好像常规的 XML 系列化,特性可用于调节 XML Web
services 生成的文件样式的 SOAP 新闻。

1.三.5 基本系列化和自定义连串化

  能够透过三种艺术试行类别化:基本系列化和自定义种类化。基本种类化使用
.NET Framework 来自动类别化对象。

一.三.5.一 基本类别化

  基本连串化的唯一供给是目的必须选拔 SerializableAttribute 天性。 NonSerializedAttribute 可用于禁止连串化特定字段。

  使用基本种类化时,对象的版本调控恐怕会生出难题,在那种情景下,自定义连串化只怕更贴切。基本类别化是实施连串化的最简便的方法,但对进度提供的决定并不多。

一.三.伍.2 自定义种类化

  在自定义连串化中,能够确切地钦定将系列化哪些对象以及哪些做到类别化。类必须标识为 SerializableAttribute,并达成 ISerializable 接口。
  假若指望同样以自定义格局反类别化对象,则必须采纳自定义构造函数。

1.三.陆 设计器体系化

  设计器种类化是一种特殊格局的体系化,它涉及常见与开垦工具关联的目的持久性的门类。设计器连串化是将对象图转变为事后可用以恢复生机对象图的源文件的进度。源文件能够分包代码、标志,以致含有
SQL 表新闻。有关越来越多消息,请参见Designer Serialization Overview。  


二、保存对象数据

  就算你能够在安排时将目的的性质设置为默许值,可是,若是该对象被损环,则在运行时输入的持有值均会丢掉。 能够使用体系化在实例之间保持对象数据,从而能够存款和储蓄值并且在下次实例化对象时寻找那个值。
  在本练习中,将开创二个简短的目标,并将该目的的数码保存到文件中。然后,当您再一次成立对象时将从该文件检索数据。最终,将修改代码以使用
SOAP 格式保持对象。  

二.1 使用体系化保存对象

威尼斯人线上娱乐 16 1
[Serializable] //将类标记为可连串化 二 public class Coupon :
INotifyPropertyChanged 三 { 四 public decimal Amount { get; set; } 伍 6public float InterestRate { get; set; } 7 捌 public int Term { get; set;
} 玖 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()]
//将可体系化的类中的某字段标志为不被类别化 二三 public event
PropertyChanged伊夫ntHandler PropertyChanged; 二4 25 public Coupon(decimal
amount, float interestRate, int term, string name) 二六 { 二七 Amount =
amount; 2八 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         }

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

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

图2-3

  反系列化时也应用 SoapFormatter 就可以,结果同图二-贰。

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

  【注意】本示例将数据存款和储蓄到二进制或
SOAP 格式的文本中。不应将那个格式用中国“氢弹之父”感数据,如密码或信用卡新闻。

  【备注】贰进制格式对于绝大大多Windows 应用程序均适用。但对于
Web 应用程序或 Web 服务,您大概希望采纳 SOAP 格式将目标保存到 XML
文件中,以使对象易于共享。

  也可以透过 XmlSerializer 将对象体系化保存在
XML 文件。依据须要采取适用的类别化器,操作基本是一模同样的。

 

 

—预览版,待整治实现放到首页—

] 说说体系化, 说说类别化 【博主】反骨仔
【原著地址】 序 目录
种类化 保存对象数据 1、系列化…


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图