C# 知识回看 –  类别化

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

C# 知识回想 –  连串化

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

[C#] 说说连串化,

系列化是将二个对象调换到字节流以达到将其悠久保存在内部存款和储蓄器、数据库或文件中的管理进程。它的重大目的是保存对象的意况以便现在需求的时候使用。与其相反的进度叫做反种类化。

目录

  • 类别化的意思
  • 透过体系化保存对象数据
  • 批评纷繁

 

目录

  • 类别化的意思
  • 由此系列化保存对象数据
  • 谈论纷纷

说说类别化,知识回看。 

说说系列化

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

体系化贰个目的

为了种类化贰个目标,大家要求多少个被序列化的对象,二个容纳被类别化了的目标的(字节)流和3个格式化器。实行连串化在此之前我们先看看System.Runtime.Serialization名字空间。I塞里alizable接口允许大家使其余类成为可连串化的类。

假定大家给自个儿写的类标志[Serializable]特点,大家就能将那么些类系列化。除非类的分子标志了[NonSerializable],体系化会将类中的全数成员都连串化。

系列化的品种

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

二进制(流)序列化:

二进制(流)序列化是壹种将数据写到输出流,以使它亦可用来机关心保养构成相应对象的编制。二进制,其名字就暗暗提示它的画龙点睛音讯是保存在存款和储蓄介质上,而那几个不能缺少信息必要创立贰个目的的可相信的二进制别本。在二进制(流)连串化中,整个对象的情事都被保存起来,而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磋商是2个在异构的应用程序之间开始展览音信相互的赏心悦目的取舍。大家供给在应用程序中加多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序列化将3个对象或参数的公然字段和性质以及艺术的重回值调换(种类化)成服从XSD文书档案标准的XML流。因为XML是1个绽放的正统,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();


        }
    }
}

怎么着是格式化器?

一个格式化器用来规定三个目标的行列格式。它们目标是在互联网上传输一个目的在此之前将其类别化成合适的格式。它们提供IFormatter接口。在.NET里提供了五个格式化类:BinaryFormatterSoapFormatter,它们都持续了IFormatter接口。

应用体系化

体系化允许开辟人员保存二个目的的情景并在需求的时候重构对象,同时很好地支撑对象存款和储蓄和数据沟通。通过体系化,开采人士能够使用Web
Service发送对象到远端应用程序,从3个域传输对象到另二个域,以XML的格式传输三个对象并能通过防火墙,也许在应用程序间保险安全性或用户特定音讯等等。

本文中的全数译文仅用于学习和调换目标,转发请务必注脚小说译者、出处、和本文链接
我们的翻译专门的职业遵照 CC
协议,如若我们的做事有侵略到您的机动,请立即联系大家

 

1、体系化的含义

  种类化
(Serialization)将对象的场合音信管理为字节流,以便于积累或传输到内部存储器、数据库或文件的多少个进度。在系列化时期,对象将其目前气象写入到权且或持久性存款和储蓄区,主要目标是保留对象的图景。便于日后从该情状中开始展览苏醒,创造新的靶子,这几个历程又称为反类别化。

 

一、种类化的意思

  种类化
(Serialization)将目标的气象新闻管理为字节流,以便于积攒或传输到内存、数据库或文件的三个进程。在系列化时期,对象将其目前场合写入到目前或持久性存储区,首要目标是保留对象的情况。便于日后从本场馆中实行还原,成立新的对象,那一个进度又称作反连串化。

 

一.一 系列化的行事章程

金沙注册送58 1

图1.1-1

 

金沙注册送58 2

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

 

一.一 类别化的专门的学问章程

金沙注册送58 3

图1.1-1

 

金沙注册送58 4

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

 

目录

  • 序列化
  • 保留对象数据

 

一.2 用于体系化

  我们在数据调换的时候常进行系列化保存对象的多寡音讯,在急需运用它的时候再实行反连串化重新读取对象的音讯并开始展览校验和存款和储蓄的有些干活。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举行解析管理)。

 

一.二 用于系列化

  我们在数据交流的时候常举行连串化保存对象的多少新闻,在需求动用它的时候再开始展览反类别化重新读取对象的音信并张开校验和积累的壹对行事。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
实行分析管理)。

 

一、序列化

  连串化是将对象管理为字节流以存款和储蓄对象或传输到内存、数据库或文件。其主要目标是保存对象的景况,以便能够在急需时再也成立对象。相反的长河称为反体系化。
 

一.3 使对象可种类化

  举行系列化的操作,要求:1个带体系化的目标,1个是带有体系化对象的流和三个类别化器(Formatter)。

  大家开始展览编写制定的类中,暗中认可会给类增加 SerializableAttribute 性情的,当然你也得以利用显式的法子开展增加。当您计划对二个目的开始展览连串化时,借使它不包蕴 SerializableAttribute,将会迷惑那些。在一些时候,我们大概不指望类中的某个字段或性质进行系列化操作,你能够在该字段或质量上应用 NonSerializedAttribute ,以告知体系化器不对它们进行连串化操作。

 

  【备注】倘诺已系列化的类中含有了别样类对象的引用,而那么些类又刚好也有
SerializableAttribute,那么它们也会被开始展览类别化。

  【备注】体系化的关键字性格:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍1种普及的系列化和一种不遍布的种类化:

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

  (二)XML
系列化:可读性越来越高,也就表示有更加高的狡猾,操作的便利性。可用 XmlSerializer 实行体系化操作。

 

 


一.三 使对象可类别化

  实行连串化的操作,必要:3个带连串化的目的,八个是含有类别化对象的流和一个类别化器(Formatter)。

  大家开始展览编写制定的类中,暗中同意会给类增进 SerializableAttribute 天性的,当然你也得以选取显式的点子开展增加。当你筹算对3个对象开始展览连串化时,假使它不带有 SerializableAttribute,将会抓住那些。在好曾几何时候,大家兴许不愿意类中的有个别字段或质量举办系列化操作,你能够在该字段或性质上利用 NonSerializedAttribute ,以报告系列化器不对它们举行连串化操作。

 

  【备注】假诺已种类化的类中蕴藏了任何类对象的引用,而那一个类又凑巧也有
SerializableAttribute,那么它们也会被开始展览种类化。

  【备注】种类化的基本点字性情:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍1种遍布的种类化和一种不普及的系列化:

  (壹)2进制连串化:使用2进制编码来扭转精简的体系化,会体系化全体成员,并升高品质。常用来存款和储蓄和
socket 传输。

  (二)XML
类别化:可读性越来越高,也就象征有越来越高的百发百中,操作的便利性。可用 XmlSerializer 举行连串化操作。

 

 


一.1 体系化的办事办法

  此图展现类别化的满贯经过。 图壹.一-1

  金沙注册送58 5
  对象被系列化为流。流传递的不不过数码,还包含有关对象类型的新闻,如目的的本子、区域性和次序集名称。通过该流,能够将对象存款和储蓄在数据库、文件或内存中。

贰、通过种类化保存对象数据

  那里运用
demo 举办简要演示如何对目的开始展览类别化和反体系化操作。

 

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

  那里运用
demo 进行简短演示如何对目的开展种类化和反类别化操作。

 

一.贰 用于类别化

  通过系列化,开垦职员能够保留对象的情状,并在急需时再度创建该对象,从而提供对象的储存以及数据交流。通过系列化,开垦职员还足以实行类似如下的操作:通过
Web 服务将对象发送到远程应用程序、将目标从2个域传递到另贰个域、以 XML
字符串的样式跨防火墙传递对象,或许跨应用程序维护安全新闻或用户特定新闻。

二.壹 使用种类化保存对象

金沙注册送58 6金沙注册送58 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         }

金沙注册送58 8

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

金沙注册送58 9

图2-2

 

2.一 使用种类化保存对象

金沙注册送58 10金沙注册送58 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         }

金沙注册送58 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         }

金沙注册送58 13

图2-2

 

一.3 使对象可类别化

  若要体系化对象,您须要待体系化的靶子、要包含类别化对象的流,以及3个 Formatter。 System.Runtime.Serialization包涵连串化和反类别化对象所需的类。
  将 SerializableAttribute 天性应用于二个类型可提醒该品种的实例能够连串化。尝试系列化时,假若类型未有 塞里alizableAttribute 性情,将吸引SerializationException 非常。
  要是不期望类中的字段可类别化,请应用 NonSerializedAttribute 性子。假如可系列化类型的字段蕴含指针、句柄或其余一些专用于特定境遇的数据结构,并且无法在分化的条件中以有含义的方法重建,则大概须求使该字段不可系列化。
  要是已系列化的类富含对标识为 SerializableAttribute 的其它类的靶子的引用,则也将体系化这一个目的。

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

金沙注册送58 14

图2-3

  反体系化时也运用 SoapFormatter 就可以,结果同图二-二。

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

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

  【备注】二进制格式对于大多数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         }

金沙注册送58 15

图2-3

  反类别化时也利用 SoapFormatter 就可以,结果同图2-二。

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

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

  【备注】二进制格式对于大多数Windows 应用程序均适用。对于之前来讲,使用
Web 应用程序或然是 Web 服务,提出选取 SOAP 的 XML
实行传输。而近期,当然是应用大众化的 json
格式实行传输啦。

 

  同样,也能够通过 XmlSerializer 将目标体系化保存在
XML 文件。大家能够依照供给采纳适宜的类别化器,操作基本是同等的。

 

1.三.一 二进制系列化和 XML 种类化

  能够采纳二进制连串化或 XML
体系化。在2进制种类化中,会种类化全部成员(以致席卷那么些只读成员),从而能够拉长质量。XML
类别化提供了可读性更加好的代码,并在对象共享和运用方面提供了更加大的狡猾,以便完毕互操作性。

批评纷繁

  @hi丶时辰候 使用
SerializableAttribute
性格时,是不提出利用机动属性的,系列化后的字段都是多出
k_BackingField<> 1几个字符,假诺目的极大会浪费壹部分流量,提出选拔DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

商量纷繁

  @hi丶小时候 使用
SerializableAttribute
天性时,是不提出利用电动属性的,连串化后的字段都以多出
k_BackingField<> 一五个字符,假设目的不小会浪费一部分流量,提出采用DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

1.3.贰 二进制类别化

  2进制种类化使用二进制编码来变化精简的连串化,以用于存储或基于套接字的网络流等。

1.3.3 XML 序列化

  XML
类别化将对象的共用字段和属性或然措施的参数及再次回到值种类化为符合一定 XML
架构定义语言 (XSD) 文书档案的 XML 流。XML 体系化会变卦具备转变为 XML
的公家属性和字段的强类型类。 System.Xml.Serialization 包涵系列化和反种类化
XML 所需的类。
  您能够将特色应用于类和类成员,以决定 XmlSerializer 系列化或反连串化类实例的艺术。

1.3.4 SOAP 序列化

  XML 种类化还可用来将目的类别化为符合 SOAP 标准的 XML 流。SOAP
是1种基于 XML 的协商,它是专门为利用 XML
来传输进度调用而规划的。就像是常规的 XML 系列化,性子可用以调整 XML Web
services 生成的文件样式的 SOAP 音讯。

一.3.伍 基本体系化和自定义种类化

  能够经过二种办法实践系列化:基本类别化和自定义种类化。基本种类化使用
.NET Framework 来自动系列化对象。

一.3.伍.一 基本种类化

金沙注册送58 ,  基本类别化的唯一要求是目标必须运用 SerializableAttribute 性情。 NonSerializedAttribute 可用于禁止连串化特定字段。

  使用基本类别化时,对象的版本调整大概会时有产生难点,在那种景色下,自定义种类化可能更妥贴。基本系列化是实行体系化的最简便的方法,但对进度提供的主宰并不多。

一.三.伍.二 自定义类别化

  在自定义连串化中,能够正确地钦定将连串化哪些对象以及怎么样造成系列化。类必须标识为 SerializableAttribute,并促成 ISerializable 接口。
  要是指望一样以自定义格局反种类化对象,则必须运用自定义构造函数。

壹.三.陆 设计器连串化

  设计器种类化是1种奇特殊形体式的体系化,它关系常见与开采工具关联的目的持久性的项目。设计器系列化是将目的图调换为以往可用于复苏对象图的源文件的过程。源文件能够涵盖代码、标识,以至饱含
SQL 表音信。有关越来越多消息,请参见Designer Serialization Overview。  


2、保存对象数据

  即便您能够在规划时将对象的属性设置为暗中认可值,但是,借使该目的被损环,则在运维时输入的享有值均会丢掉。 能够使用连串化在实例之间维持对象数据,从而能够存款和储蓄值并且在下次实例化对象时搜索这个值。
  在本练习中,将创设三个简易的目标,并将该对象的数目保存到文件中。然后,当您再也创设对象时将从该文件检索数据。最终,将修改代码以利用
SOAP 格式保持对象。  

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

金沙注册送58 16 1
[Serializable] //将类标志为可连串化 二 public class Coupon :
INotifyPropertyChanged 三 { 4 public decimal Amount { get; set; } 伍 陆public float InterestRate { get; set; } 7 捌 public int Term { get; set;
} 玖 拾 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; 2四 2五 public Coupon(decimal
amount, float interestRate, int term, string name) 二陆 { 2七 Amount =
amount; 2八 InterestRate = interestRate; 2玖 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 格式的文书中。不应将那几个格式用中国“氢弹之父”感数据,如密码或信用卡音讯。

  【备注】2进制格式对于许多Windows 应用程序均适用。但对于
Web 应用程序或 Web 服务,您恐怕希望选取 SOAP 格式将对象保存到 XML
文件中,以使对象易于共享。

  也足以因此 XmlSerializer 将目的种类化保存在
XML 文件。根据须要选择适合的连串化器,操作基本是同样的。

 

 

—预览版,待整治完成放到首页—

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

相关文章

网站地图xml地图