的二种系列化方法,知识回想

By admin in 4858.com on 2019年4月7日

C# 知识回想 –  种类化

 【博主】反骨仔    【原来的作品地址】

C# 知识回想 –  种类化

 【博主】反骨仔    【最初的文章地址】

[C#] 说说种类化,

类别化是将2个指标转换到字节流以达成将其漫长保存在内部存储器、数据库或文件中的处理进程。它的重点指标是保存对象的状态以便现在必要的时候利用。与其相反的进度叫做反种类化。

目录

  • 体系化的意思
  • 由此系列化保存对象数据
  • 议论纷繁

 

目录

  • 体系化的意义
  • 经过连串化保存对象数据
  • 议论纷繁

 

说说类别化

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

种类化二个对象

为了序列化贰个对象,大家须要一个被连串化的指标,八个兼收并蓄被连串化了的靶子的(字节)流和三个格式化器。举行系列化在此之前大家先看看System.Runtime.Serialization名字空间。ISerializable接口允许大家使别的类成为可种类化的类。

借使我们给自个儿写的类标识[Serializable]特点,我们就能将这么些类系列化。除非类的积极分子标记了[NonSerializable],种类化会将类中的全数成员都序列化。

系列化的类型

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

二进制(流)序列化:

二进制(流)序列化是一种将数据写到输出流,以使它能够用来机关心爱抚构成相应对象的建制。2进制,其名字就暗示它的不可或缺消息是保存在存款和储蓄介质上,而那些不可缺少消息必要创造3个目的的标准的二进制副本。在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合计是1个在异构的应用程序之间开始展览新闻交互的优异的选料。我们供给在应用程序中添加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序列化将多个对象或参数的当众字段和属性以及艺术的重临值转换(类别化)成遵从XSD文书档案标准的XML流。因为XML是四个怒放的标准,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();


        }
    }
}

如何是格式化器?

一个格式化器用来鲜明1个指标的行列格式。它们指标是在互联网上传输叁个对象从前将其体系化成合适的格式。它们提供IFormatter的二种系列化方法,知识回想。接口。在.NET里提供了多个格式化类:BinaryFormatterSoapFormatter,它们都延续了IFormatter接口。

应用种类化

种类化允许开发人士保存多少个目的的状态并在必要的时候重构对象,同时很好地支撑对象存款和储蓄和数据交换。通过类别化,开发职员能够使用Web
Service发送对象到远端应用程序,从贰个域传输对象到另三个域,以XML的格式传输2个对象并能通过防火墙,恐怕在应用程序间保证安全性或用户特定新闻等等。

正文中的全体译文仅用于学习和调换目标,转发请务必证明小说译者、出处、和本文链接
咱俩的翻译工作依据 CC
协议,就算大家的行事有侵袭到您的变通,请及时联系大家

 

1、类别化的意义

  体系化
(Serialization)将指标的情事消息处理为字节流,以便于储存或传输到内部存款和储蓄器、数据库或文件的二个进程。在体系化时期,对象将其眼下景色写入到临时或持久性存储区,首要目标是保留对象的情况。便于日后从该情形中开始展览复苏,创立新的靶子,这几个历程又称为反种类化。

 

壹、种类化的含义

  体系化
(Serialization)将目的的情事新闻处理为字节流,以便于储存或传输到内部存款和储蓄器、数据库或文件的八个历程。在种类化期间,对象将其日前状态写入到一时或持久性存款和储蓄区,首要目标是保留对象的情景。便于日后从该意况中实行回复,成立新的目的,这一个进程又称之为反连串化。

 

壹.1 连串化的劳作办法

4858.com 1

图1.1-1

 

4858.com 2

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

 

1.1 系列化的工作措施

4858.com 3

图1.1-1

 

4858.com 4

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

 

目录

  • 序列化
  • 封存对象数据

 

一.二 用于类别化

  大家在数据调换的时候常举办类别化保存对象的数据音讯,在供给运用它的时候再开始展览反种类化重新读取对象的新闻并展开校验和仓库储存的1对干活。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
实行分析处理)。

 

一.2 用于类别化

  大家在数据调换的时候常实行种类化保存对象的多少音信,在供给选用它的时候再开始展览反系列化重新读取对象的音信并开始展览校验和仓库储存的有的做事。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举办分析处理)。

 

一、序列化

  种类化是将对象处理为字节流以存款和储蓄对象或传输到内存、数据库或文件。其首要指标是保存对象的情况,以便能够在急需时再一次创设对象。相反的进度称为反连串化。
 

1.3 使对象可种类化

  进行连串化的操作,须求:八个带连串化的靶子,叁个是含有类别化对象的流和3个体系化器(Formatter)。

  大家开始展览编辑的类中,私下认可会给类拉长 SerializableAttribute 天性的,当然你也得以利用显式的点子展开添加。当您打算对2个目的举办系列化时,倘诺它不包括 SerializableAttribute,将会吸引那些。在少数时候,大家也许不指望类中的有个别字段或质量进行连串化操作,你能够在该字段或性质上接纳 NonSerializedAttribute ,以报告体系化器不对它们举行连串化操作。

 

  【备注】若是已类别化的类中带有了别的类对象的引用,而那一个类又正好也有
SerializableAttribute,那么它们也会被进行类别化。

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

 

  那里介绍一种常见的连串化和壹种不普遍的系列化:

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

  (二)XML
类别化:可读性越来越高,也就意味着有越来越高的灵活性,操作的便利性。可用 XmlSerializer 举行体系化操作。

 

 


一.3 使对象可体系化

  进行体系化的操作,须求:多少个带种类化的指标,2个是包涵系列化对象的流和二个体系化器(Formatter)。

  大家开始展览编辑的类中,默许会给类增进 SerializableAttribute 个性的,当然你也能够运用显式的不2秘籍实行添加。当您打算对二个指标开始展览体系化时,假设它不含有 SerializableAttribute,将会抓住那些。在壹些时候,我们恐怕不期望类中的有个别字段或品质举行系列化操作,你能够在该字段或性质上运用 NonSerializedAttribute ,以告知连串化器不对它们举办类别化操作。

 

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

  【备注】连串化的关键字天性:SerializableAttribute、NonSerializedAttribute4858.com ,。

 

  那里介绍一种常见的连串化和壹种不常见的系列化:

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

  (二)XML
体系化:可读性更加高,也就代表有更加高的布帆无恙,操作的便利性。可用 XmlSerializer 进行系列化操作。

 

 


1.壹 种类化的办事格局

  此图展现类别化的全体经过。 图壹.一-一

  4858.com 5
  对象被体系化为流。流传递的不只是数码,还包罗关于对象类型的消息,如目的的本子、区域性和顺序集名称。通过该流,能够将对象存款和储蓄在数据库、文件或内部存款和储蓄器中。

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

  这里运用
demo 举办简易演示怎么样对目的开始展览种类化和反连串化操作。

 

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

  那里运用
demo 举办不难演示如何对目的开展种类化和反类别化操作。

 

一.2 用于体系化

  通过体系化,开发人士能够保存对象的情景,并在急需时再一次创制该指标,从而提供对象的囤积以及数据交流。通过连串化,开发职员还足以实施类似如下的操作:通过
Web 服务将对象发送到远程应用程序、将对象从1个域传递到另几个域、以 XML
字符串的款式跨防火墙传递对象,恐怕跨应用程序维护安全新闻或用户特定新闻。

二.壹 使用系列化保存对象

4858.com 64858.com 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         }

4858.com 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         }

4858.com 9

图2-2

 

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

4858.com 104858.com 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         }

4858.com 12

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

4858.com 13

图2-2

 

1.叁 使对象可连串化

  若要体系化对象,您要求待体系化的指标、要含有体系化对象的流,以及一个 Formatter。 System.Runtime.Serialization包蕴系列化和反系列化对象所需的类。
  将 SerializableAttribute 性格应用于贰个档次可提示该类型的实例能够种类化。尝试种类化时,要是类型未有 SerializableAttribute 性情,将抓住SerializationException 非常。
  假设不期望类中的字段可类别化,请应用 NonSerializedAttribute 性情。假使可连串化类型的字段包涵指针、句柄或其余1些专用于特定环境的数据结构,并且不可能在不一样的条件中以有含义的主意重建,则恐怕须要使该字段不可系列化。
  若是已类别化的类富含对标记为 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         }

4858.com 14

图2-3

  反连串化时也应用 SoapFormatter 即可,结果同图二-贰。

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

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

  【备注】二进制格式对于多数
Windows 应用程序均适用。对于在此在此之前来说,使用
Web 应用程序或许是 Web 服务,提议利用 SOAP 的 XML
进行传输。而如今,当然是运用大众化的 json
格式举行传输啦。

 

  同样,也得以透过 XmlSerializer 将对象种类化保存在
XML 文件。大家得以依照需要选拔适合的类别化器,操作基本是同1的。

 

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

4858.com 15

图2-3

  反类别化时也应用 SoapFormatter 即可,结果同图二-二。

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

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

  【备注】②进制格式对于绝超过二分之一Windows 应用程序均适用。对于以前来说,使用
Web 应用程序只怕是 Web 服务,提议利用 SOAP 的 XML
举行传输。而现在,当然是采用大众化的 json
格式举办传输啦。

 

  同样,也得以透过 XmlSerializer 将对象连串化保存在
XML 文件。我们得以根据需要接纳伏贴的类别化器,操作基本是1样的。

 

一.三.一 二进制连串化和 XML 类别化

  能够利用二进制类别化或 XML
连串化。在2进制种类化中,会类别化全体成员(甚至包涵那2个只读成员),从而能够拉长质量。XML
连串化提供了可读性越来越好的代码,并在对象共享和动用方面提供了更加大的油滑,以便完结互操作性。

议论纷纷

  @hi丶时辰候 使用
SerializableAttribute
脾性时,是不提议采纳电动属性的,体系化后的字段都是多出
k_BackingField<> 1九个字符,要是指标十分大会浪费一部分流量,建议选取DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

议论纷纷

  @hi丶小时候 使用
SerializableAttribute
天性时,是不提议使用自动属性的,类别化后的字段都以多出
k_BackingField<> 壹四个字符,假如目的十分的大会浪费1部分流量,提议利用
DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

1.三.二 贰进制体系化

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

1.3.3 XML 序列化

  XML
系列化将对象的共用字段和特性恐怕措施的参数及再次回到值连串化为符合一定 XML
架构定义语言 (XSD) 文书档案的 XML 流。XML 连串化会变动具有转换为 XML
的集体性质和字段的强类型类。 System.Xml.Serialization 包罗种类化和反系列化
XML 所需的类。
  您能够将特色应用于类和类成员,以决定 Xml塞里alizer 系列化或反连串化类实例的法门。

1.3.4 SOAP 序列化

  XML 体系化还可用来将对象连串化为符合 SOAP 规范的 XML 流。SOAP
是一种基于 XML 的商谈,它是专程为利用 XML
来传输进度调用而规划的。就像常规的 XML 连串化,特性可用以控制 XML Web
services 生成的文书样式的 SOAP 新闻。

一.三.5 基本种类化和自定义类别化

  能够由此三种方式实施连串化:基本体系化和自定义体系化。基本类别化使用
.NET Framework 来自动连串化对象。

一.三.5.一 基本系列化

  基本类别化的绝无仅有需求是指标必须使用 SerializableAttribute 性子。 NonSerializedAttribute 可用于禁止类别化特定字段。

  使用基本类别化时,对象的版本控制可能会发生难题,在那种情景下,自定义种类化只怕更贴切。基本系列化是实践连串化的最简便的办法,但对经过提供的控制并不多。

一.三.5.二 自定义系列化

  在自定义种类化中,能够准确地钦命将种类化哪些对象以及怎么着成功种类化。类必须标记为 SerializableAttribute,并得以实现 ISerializable 接口。
  假使期望同样以自定义格局反系列化对象,则必须运用自定义构造函数。

壹.三.陆 设计器种类化

  设计器连串化是1种特有方式的系列化,它事关常见与开发工具关联的对象持久性的体系。设计器连串化是将指标图转换为之后可用以恢复生机对象图的源文件的历程。源文件能够包涵代码、标记,甚至含有
SQL 表新闻。有关愈来愈多新闻,请参见Designer Serialization Overview。  


2、保存对象数据

  固然你可以在布署时将指标的习性设置为暗许值,可是,尽管该对象被损环,则在运维时输入的富有值均会丢掉。 能够应用种类化在实例之间保持对象数据,从而能够存款和储蓄值并且在下次实例化对象时追寻那一个值。
  在本演练中,将创立一个归纳的对象,并将该指标的数据保存到文件中。然后,当你再一次创造对象时将从该公文字笔迹检测索数据。最后,将修改代码以使用
SOAP 格式保持对象。  

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

4858.com 16 1
[Serializable] //将类标记为可连串化 二 public class Coupon :
INotifyPropertyChanged 3 { 四 public decimal Amount { get; set; } 伍 陆public 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; 二四 25 public Coupon(decimal
amount, float interestRate, int term, string name) 26 { 二七 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律。

 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 即可,结果同图二-2。

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

  【注意】本示例将数据存储到二进制或
SOAP 格式的文件中。不应将这一个格式用于敏感数据,如密码或信用卡消息。

  【备注】二进制格式对于超越50%Windows 应用程序均适用。但对于
Web 应用程序或 Web 服务,您或然希望采用 SOAP 格式将指标保存到 XML
文件中,以使对象易于共享。

  也得以因此 XmlSerializer 将对象体系化保存在
XML 文件。依照须求采用合适的系列化器,操作基本是千篇壹律的。

 

 

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

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

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有