文化回想,的两种类别化方法

C# 知识回看 –  连串化

 【博主】反骨仔    【原著地址】

C# 知识回看 –  体系化

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

[C#] 说说类别化,

体系化是将二个对象调换到字节流以高达将其长时间保存在内部存款和储蓄器、数据库或文件中的管理进程。它的紧要目的是保留对象的意况以便以往要求的时候利用。与其相反的历程叫做反体系化。

目录

  • 体系化的含义
  • 经过体系化保存对象数据
  • 商议纷繁

 

目录

  • 种类化的含义
  • 透过体系化保存对象数据
  • 谈论纷纷

 

说说系列化

 【博主】反骨仔    【原作地址】

连串化二个对象

为了系列化三个目标,我们必要2个被种类化的靶子,三个容纳被体系化了的对象的(字节)流和多少个格式化器。实行体系化在此以前我们先看看System.Runtime.Serialization名字空间。ISerializable接口允许我们使任何类成为可连串化的类。

固然大家给自个儿写的类标记[Serializable]特征,大家就能将这几个类类别化。除非类的积极分子标志了[NonSerializable],类别化会将类中的全部成员都体系化。

种类化的花色

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

二进制(流)序列化:

二进制(流)序列化是1种将数据写到输出流,以使它能够用来机关重构成相应对象的体制。二进制,其名字就暗暗提示它的画龙点睛新闻是保存在存款和储蓄介质上,而那几个不能缺少消息供给创造五个目标的可信的二进制别本。在二进制(流)系列化中,整个对象的情状都被保存起来,而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();


        }
    }
}

何以是格式化器?

一个格式化器用来鲜明一个对象的行列格式。它们目的是在网络上传输3个目的在此之前将其类别化成合适的格式。它们提供IFormatter接口。在.NET里提供了三个格式化类:BinaryFormatterSoapFormatter,它们都再三再四了IFormatter接口。

利用种类化

连串化允许开采职员保存三个目的的情形并在急需的时候重构对象,同时很好地支持对象存款和储蓄和数据沟通。通过类别化,开垦职员能够应用Web
Service发送对象到远端应用程序,从贰个域传输对象到另3个域,以XML的格式传输二个目的并能通过防火墙,只怕在应用程序间有限支撑安全性或用户特定新闻等等。

正文中的全部译文仅用于学习和沟通目标,转载请务必声明作品译者、出处、和本文链接
作者们的翻译工作遵照 CC
协议,若是大家的做事有侵袭到您的机动,请登时联系大家

 

1、种类化的意思

  连串化
(Serialization)将目的的事态音信管理为字节流,以便于积累或传输到内部存储器、数据库或文件的四个历程。在系列化时期,对象将其目前意况写入到目前或持久性存款和储蓄区,首要目的是保留对象的情景。便于日后从本场所中张开回复,成立新的对象,这一个进程又叫做反序列化。

 

一、类别化的含义

  种类化
(Serialization)将目的的状态音信管理为字节流,以便于积存或传输到内部存款和储蓄器、数据库或文件的1个进程。在种类化时期,对象将其日前景观写入到一时或持久性存款和储蓄区,首要目标是保存对象的动静。便于日后从该情状中开始展览回复,创设新的靶子,这么些历程又叫做反类别化。

 

一.1 体系化的做事措施

亚洲必赢官网 1

图1.1-1

 

亚洲必赢官网 2

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

 

一.一 连串化的劳作章程

亚洲必赢官网 3

图1.1-1

 

亚洲必赢官网 4

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

 

目录

  • 序列化
  • 保留对象数据

 

一.2 用于体系化

  大家在数据沟通的时候常实行体系化保存对象的数目音信,在急需运用它的时候再拓展反系列化重新读取对象的新闻并实行校验和存款和储蓄的某些工作。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
实行解析管理)。

 

一.二 用于种类化

  大家在数据交流的时候常举办系列化保存对象的数目信息,在急需选拔它的时候再开展反体系化重新读取对象的音信并张开校验和仓库储存的一些干活。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
进行辨析管理)。

 

一、序列化

  系列化是将目的管理为字节流以存款和储蓄对象或传输到内部存储器、数据库或文件。其重视目标是保留对象的图景,以便能够在急需时再次创造对象。相反的进程称为反连串化。
 

一.三 使对象可类别化

  举办种类化的操作,要求:3个带连串化的目的,二个是含有体系化对象的流和一个种类化器(Formatter)。

  大家开始展览编写制定的类中,暗许会给类增加 SerializableAttribute 天性的,当然你也得以利用显式的法子开始展览加多。当您筹划对三个目的开始展览类别化时,如若它不包涵 SerializableAttribute,将会引发那个。在少数时候,我们恐怕不指望类中的有个别字段或质量进行种类化操作,你能够在该字段或性质上采取 NonSerializedAttribute ,以报告体系化器不对它们实行连串化操作。

 

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

  【备注】体系化的要紧字本性:SerializableAttribute、NonSerializedAttribute。

 

  那里介绍1种常见的体系化和一种不布满的种类化:

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

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

 

 


1.三 使对象可类别化

  举行体系化的操作,须要:三个带系列化的靶子,3个是带有类别化对象的流和一个体系化器(Formatter)。

  咱们开展编写制定的类中,默许会给类增加 SerializableAttribute 特性的,当然你也得以应用显式的章程张开增多。当你企图对2个目的开始展览类别化时,如果它不包蕴 SerializableAttribute,将会引发那三个。在少数时候,大家恐怕不期望类中的某个字段或质量进行类别化操作,你能够在该字段或品质上使用 NonSerializedAttribute ,以报告种类化器不对它们举办系列化操作。

 

  【备注】假诺已体系化的类中包涵了其他类对象的引用,而这几个类又恰恰也有
SerializableAttribute,那么它们也会被开始展览连串化。

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

 

  那里介绍一种普及的连串化和一种不广泛的种类化:

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

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

 

 


一.1 体系化的劳作措施

  此图突显体系化的全体进度。 图1.一-壹

  亚洲必赢官网 5
  对象被连串化为流。流传递的不只是数量,还包括有关对象类型的音信,如目标的版本、区域性和次序集名称。通过该流,能够将目的存款和储蓄在数据库、文件或内存中。

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

  那里运用
demo 进行简易演示如何对目标举行类别化和反系列化操作。

 

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

  那里运用
demo 进行轻松演示怎么着对目标开展系列化和反体系化操作。

 

一.贰 用于种类化

  通过类别化,开辟人士能够保存对象的情况,并在急需时再也创立该目的,从而提供对象的仓库储存以及数据调换。通过类别化,开辟人士仍是能够执行类似如下的操作:通过
Web 服务将对象发送到远程应用程序、将对象从一个域传递到另3个域、以 XML
字符串的款式跨防火墙传递对象,或许跨应用程序维护安全新闻或用户特定新闻。

2.1 使用类别化保存对象

亚洲必赢官网 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

 

2.1 使用类别化保存对象

亚洲必赢官网 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致。

 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

 

一.3 使对象可种类化

  若要连串化对象,您需求待系列化的对象、要含有系列化对象的流,以及贰个 Formatter。 System.Runtime.Serialization包罗体系化和反连串化对象所需的类。
  将 SerializableAttribute 天性应用于3个类型可提示该类型的实例能够类别化。尝试类别化时,就算类型没有 SerializableAttribute 天性,将抓住SerializationException 分外。
  如果不指望类中的字段可类别化,请应用 Non塞里alizedAttribute 脾气。假使可体系化类型的字段包罗指针、句柄或其他部分专用于特定情状的数据结构,并且无法在差异的条件中以有含义的艺术重建,则大概供给使该字段不可系列化。
  若是已连串化的类富含对标识为 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;    //反序列化

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

  【备注】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 就能够,结果同图二-二。

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

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

  【备注】2进制格式对于绝大繁多Windows 应用程序均适用。对于此前来讲,使用
Web 应用程序或然是 Web 服务,指出使用 SOAP 的 XML
进行传输。而近期,当然是运用大众化的 json
格式举行传输啦。

 

  同样,也得以透过 XmlSerializer 将目的系列化保存在
XML 文件。我们可以依照须求选拔合适的系列化器,操作基本是一致的。

 

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

  能够使用2进制类别化或 XML
种类化。在2进制种类化中,会种类化全体成员(以至包含那多少个只读成员),从而能够巩固品质。XML
种类化提供了可读性越来越好的代码,并在目的共享和使用方面提供了越来越大的狡滑,以便达成互操作性。

商量纷繁

  @hi丶小时候 使用
塞里alizableAttribute
本性时,是不建议利用机动属性的,种类化后的字段都以多出
k_BackingField<> 二十三个字符,要是目的十分的大会浪费一部分流量,建议接纳DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

商议纷繁

  @hi丶刻钟候 使用
塞里alizableAttribute
本性时,是不提议利用机动属性的,类别化后的字段都以多出
k_Backing菲尔德<> 一七个字符,假使目标相当大会浪费一部分流量,建议采纳DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

一.3.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.3.伍 基本系列化和自定义系列化

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

1.3.五.一 基本种类化

  基本类别化的唯一供给是目标必须运用 SerializableAttribute 性子。 NonSerializedAttribute 可用于禁止系列化特定字段。

  使用基本种类化时,对象的版本调控只怕会时有发生难点,在那种情景下,自定义体系化大概更方便。基本体系化是实践体系化的最简便易行的秘技,但对进程提供的主宰并不多。

1.三.5.2 自定义连串化

  在自定义种类化中,可以确切地内定将系列化哪些对象以及如何完毕序列化。类必须标志为 SerializableAttribute,并贯彻 ISerializable 接口。
  假诺希望一样以自定义形式反系列化对象,则必须选用自定义构造函数。

1.叁.陆 设计器体系化

  设计器体系化是一种特有方式的连串化,它关系常见与开垦工具关联的靶子持久性的项目。设计器体系化是将目的图转换为日后可用于苏醒对象图的源文件的长河。源文件能够涵盖代码、标识,乃至饱含
SQL 表新闻。有关越来越多信息,请参见Designer 塞里alization Overview。  


二、保存对象数据

  就算您能够在规划时将对象的特性设置为私下认可值,不过,如若该目标被损环,则在运营时输入的装有值均会丢掉。 能够选用类别化在实例之间维持对象数据,从而可以存款和储蓄值并且在下次实例化对象时搜索这么些值。
  在本演习中,将创立壹个简练的靶子,并将该对象的数目保存到文件中。然后,当您再一次创造对象时将从该文件检索数据。最终,将修改代码以利用
SOAP 格式保持对象。  

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

亚洲必赢官网 16 1
[Serializable] //将类标识为可种类化 二 public class Coupon :
INotifyPropertyChanged 三 { 四 public decimal Amount { get; set; } 5 6public float InterestRate { get; set; } 七 八 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()]
//将可连串化的类中的某字段标识为不被连串化 二3 public event
PropertyChanged伊芙ntHandler PropertyChanged; ②4 二5 public Coupon(decimal
amount, float interestRate, int term, string name) 2陆 { 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;    //反序列化

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

  【备注】2进制格式对于大繁多Windows 应用程序均适用。但对此
Web 应用程序或 Web 服务,您或者希望利用 SOAP 格式将目的保存到 XML
文件中,以使对象易于共享。

  也得以透过 XmlSerializer 将对象类别化保存在
XML 文件。依照供给选用适用的系列化器,操作基本是同样的。

 

 

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

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

网站地图xml地图