【美高梅开户网址】说说系列化,的三种种类化方法

C# 知识回想 –  系列化

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

C# 知识回看 –  类别化

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

[C#] 说说类别化,

体系化是将叁个对象转变来字节流以达到将其悠久保存在内部存款和储蓄器、数据库或文件中的管理进程。它的首要目标是保留对象的景况以便未来须求的时候利用。与其相反的进程叫做反类别化。

目录

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

 

目录

  • 连串化的意思
  • 由此连串化保存对象数据
  • 批评纷繁

 

说说类别化

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

美高梅开户网址 ,【美高梅开户网址】说说系列化,的三种种类化方法。种类化贰个对象

为了种类化3个对象,大家须要二个被体系化的靶子,1个兼收并蓄被系列化了的对象的(字节)流和八个格式化器。实行类别化以前大家先看看System.Runtime.Serialization名字空间。ISerializable接口允许大家使任何类成为可种类化的类。

若果大家给本人写的类标记[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共谋是3个在异构的应用程序之间张开音讯交互的可观的挑3拣4。我们须要在应用程序中增加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
瑟维斯发送对象到远端应用程序,从1个域传输对象到另叁个域,以XML的格式传输一个对象并能通过防火墙,也许在应用程序间有限援助安全性或用户特定新闻等等。

正文中的全数译文仅用于学习和调换目标,转发请务必注解小说译者、出处、和本文链接
我们的翻译专门的学问遵照 CC
协议,假设大家的做事有侵袭到您的机动,请立时联系大家

 

一、类别化的意思

  类别化
(Serialization)将目的的情状消息管理为字节流,以便于积攒或传输到内部存款和储蓄器、数据库或文件的二个历程。在种类化时期,对象将其眼下地方写入到暂且或持久性存款和储蓄区,首要目标是保留对象的状态。便于日后从这场所中张开回复,创造新的对象,那一个进度又叫做反连串化。

 

1、类别化的意思

  体系化
(Serialization)将对象的景况新闻管理为字节流,以便于积存或传输到内部存款和储蓄器、数据库或文件的二个经过。在类别化期间,对象将其目前意况写入到一时或持久性存款和储蓄区,首要目标是保存对象的状态。便于日后从这场合中打开还原,成立新的对象,那个进程又称作反体系化。

 

壹.一 种类化的办事办法

美高梅开户网址 1

图1.1-1

 

美高梅开户网址 2

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

 

一.一 类别化的干活措施

美高梅开户网址 3

图1.1-1

 

美高梅开户网址 4

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

 

目录

  • 序列化
  • 保存对象数据

 

壹.二 用于系列化

  大家在数据沟通的时候常进行类别化保存对象的多寡音信,在急需选择它的时候再举行反连串化重新读取对象的音信并开始展览校验和积攒的某个干活。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
举办解析管理)。

 

一.二 用于系列化

  大家在数据交流的时候常进行体系化保存对象的数额新闻,在急需采取它的时候再进行反类别化重新读取对象的新闻并开展校验和积存的一部分做事。常用于
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
进行解析管理)。

 

一、序列化

  种类化是将对象处理为字节流以存款和储蓄对象或传输到内部存款和储蓄器、数据库或文件。其首要目的是保存对象的意况,以便能够在急需时再度创造对象。相反的经过称为反体系化。
 

1.叁 使对象可连串化

  实行种类化的操作,必要:一个带连串化的靶子,贰个是含有连串化对象的流和多个类别化器(Formatter)。

  我们开始展览编写制定的类中,默许会给类拉长 SerializableAttribute 个性的,当然你也能够动用显式的措施开始展览增加。当你筹划对1个目的开始展览类别化时,假使它不包罗 SerializableAttribute,将会引发那么些。在少数时候,大家大概不指望类中的有个别字段或质量实行连串化操作,你能够在该字段或性质上选择 NonSerializedAttribute ,以告知种类化器不对它们进行类别化操作。

 

  【备注】若是已体系化的类中包括了其余类对象的引用,而这么些类又恰好也有
SerializableAttribute,那么它们也会被举行系列化。

  【备注】系列化的重大字个性:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍壹种常见的系列化和1种不广泛的类别化:

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

  (2)XML
连串化:可读性越来越高,也就表示有更加高的灵活性,操作的便利性。可用 XmlSerializer 进行体系化操作。

 

 


一.三 使对象可类别化

  实行系列化的操作,须要:三个带系列化的目的,三个是包括系列化对象的流和1个类别化器(Formatter)。

  咱们开始展览编写制定的类中,暗中认可会给类拉长 SerializableAttribute 性子的,当然你也足以采纳显式的办法进行增多。当你筹划对三个目的开展系列化时,要是它不带有 SerializableAttribute,将会抓住那三个。在一些时候,大家大概不指望类中的有个别字段或性质进行体系化操作,你能够在该字段或性质上运用 NonSerializedAttribute ,以报告体系化器不对它们进行类别化操作。

 

  【备注】假若已种类化的类中涵盖了此外类对象的引用,而那些类又刚刚也有
SerializableAttribute,那么它们也会被开展类别化。

  【备注】系列化的重大字特性:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍壹种普及的类别化和1种不普及的连串化:

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

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

 

 


一.一 体系化的劳作办法

  此图显示系列化的全套进度。 图一.一-一

  美高梅开户网址 5
  对象被种类化为流。流传递的不只是多少,还包蕴有关对象类型的消息,如目的的版本、区域性和次序集名称。通过该流,能够将目的存款和储蓄在数据库、文件或内部存款和储蓄器中。

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

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

 

二、通过类别化保存对象数据

  那里运用
demo 举行简短演示怎么着对目的进行系列化和反系列化操作。

 

1.贰 用于体系化

  通过连串化,开拓人士能够保存对象的动静,并在必要时再度创造该目标,从而提供对象的仓库储存以及数据调换。通过种类化,开辟人士还能进行类似如下的操作:通过
Web 服务将目的发送到远程应用程序、将对象从二个域传递到另多少个域、以 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         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

 

一.三 使对象可类别化

  若要系列化对象,您必要待体系化的对象、要含有系列化对象的流,以及1个 Formatter。 System.Runtime.Serialization包括连串化和反连串化对象所需的类。
  将 SerializableAttribute 天性应用于2个项目可提示该类型的实例能够体系化。尝试系列化时,倘若类型未有 SerializableAttribute 特性,将引发SerializationException 极度。
  假若不希望类中的字段可连串化,请应用 NonSerializedAttribute 性格。假如可系列化类型的字段包蕴指针、句柄或其余部分专用于特定情形的数据结构,并且不能够在分化的条件中以有含义的情势重建,则恐怕供给使该字段不可连串化。
  如果已系列化的类富含对标志为 SerializableAttribute 的其余类的靶子的引用,则也将连串化那一个目标。

二.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 就可以,结果同图二-二。

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

  【注意】不应将这么些格式用于敏感数据,如密码或信用卡音信。

  【备注】二进制格式对于绝大好多Windows 应用程序均适用。对于以前来讲,使用
Web 应用程序只怕是 Web 服务,提出使用 SOAP 的 XML
举行传输。而以往,当然是采取大众化的 json
格式举行传输啦。

 

  同样,也得以经过 XmlSerializer 将对象系列化保存在
XML 文件。大家得以依赖必要选用稳妥的类别化器,操作基本是同等的。

 

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

美高梅开户网址 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.一 贰进制类别化和 XML 体系化

  能够应用2进制类别化或 XML
种类化。在2进制连串化中,会体系化全体成员(乃至席卷那多少个只读成员),从而得以进步品质。XML
体系化提供了可读性更加好的代码,并在目的共享和行使方面提供了更加大的狡猾,以便实现互操作性。

评论纷繁

  @hi丶时辰候 使用
塞里alizableAttribute
天性时,是不建议利用机动属性的,系列化后的字段都以多出
k_BackingField<> 二十个字符,假使目的非常的大会浪费一部分流量,提议选用DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

冲突纷纷

  @hi丶刻钟候 使用
SerializableAttribute
性龙时,是不建议使用自动属性的,类别化后的字段都以多出
k_BackingField<> 一九个字符,假如目的比极大会浪费1部分流量,建议利用
DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

一.三.二 二进制体系化

  2进制类别化使用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.三.伍 基本体系化和自定义连串化

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

壹.三.五.1 基本类别化

  基本类别化的唯1需要是目的必须采纳 SerializableAttribute 个性。 NonSerializedAttribute 可用于禁止系列化特定字段。

  使用基本连串化时,对象的版本调控可能会生出难题,在那种气象下,自定义类别化恐怕更适于。基本连串化是推行系列化的最简易的办法,但对进度提供的支配并不多。

一.叁.5.二 自定义体系化

  在自定义连串化中,能够标准地钦命将种类化哪些对象以及哪些达成体系化。类必须标志为 SerializableAttribute,并贯彻 ISerializable 接口。
  要是愿意同样以自定义形式反类别化对象,则必须使用自定义构造函数。

一.叁.陆 设计器类别化

  设计器连串化是1种尤其形式的种类化,它涉及常见与开荒工具关联的目标持久性的花色。设计器系列化是将对象图调换为随后可用以苏醒对象图的源文件的进度。源文件能够包蕴代码、标记,乃至含有
SQL 表音信。有关越来越多新闻,请参见Designer Serialization Overview。  


二、保存对象数据

  纵然你能够在统一计划时将目标的属性设置为暗许值,但是,假诺该对象被损环,则在运转时输入的兼具值均会丢掉。 能够接纳种类化在实例之间保持对象数据,从而能够存款和储蓄值并且在下次实例化对象时追寻那一个值。
  在本演练中,将成立二个简练的靶子,并将该目的的多寡保存到文件中。然后,当你再一次创制对象时将从该文件检索数据。最终,将修改代码以利用
SOAP 格式保持对象。  

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

美高梅开户网址 16 1
[Serializable] //将类标志为可连串化 二 public class Coupon :
INotifyPropertyChanged 叁 { 四 public decimal Amount { get; set; } 5 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; 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 文件。依据需求选择适宜的系列化器,操作基本是同样的。

 

 

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

] 说说类别化, 说说种类化 【博主】反骨仔
【原来的书文地址】 序 目录
种类化 保存对象数据 1、连串化…

发表评论

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

网站地图xml地图