威尼斯人线上娱乐

的二种体系化方法,说说序列化

4 5月 , 2019  

C# 知识回看 –  体系化

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

[C#] 说说类别化,

种类化是将多少个目的转变到字节流以达到将其悠久保存在内部存款和储蓄器、数据库或文件中的管理进程。它的重大目的是保存对象的动静以便今后要求的时候利用。与其相反的经过叫做反序列化。

目录

  • 连串化的意义
  • 威尼斯人线上娱乐,经过种类化保存对象数据
  • 商议纷繁

 

说说连串化

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

种类化一个目的

为了类别化三个目的,我们供给1个被体系化的目的,三个容纳被连串化了的靶子的(字节)流和2个格式化器。进行体系化从前大家先看看System.Runtime.Serialization名字空间。ISerializable接口允许我们使别的类成为可种类化的类。

若果大家给和谐写的类标记[Serializable]性格,大家就能够将那一个类类别化。除非类的积极分子标志了[NonSerializable],系列化会将类中的全部成员都体系化。

种类化的种类

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

二进制(流)序列化:

二进制(流)序列化是一种将数据写到输出流,以使它亦可用来机关心重视构成相应对象的编写制定。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序列化将一个指标或参数的公开字段和品质以及艺术的再次回到值转变(类别化)成遵从XSD文书档案标准的XML流。因为XML是2个盛开的正规,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发送对象到远端应用程序,从二个域传输对象到另1个域,以XML的格式传输1个目的并能通过防火墙,大概在应用程序间保证安全性或用户特定音信等等。

本文中的全部译文仅用于学习和沟通目标,转发请务必评释小说译者、出处、和本文链接
大家的翻译工作鲁人持竿 CC
协议,假设大家的干活有入侵到你的灵活,请登时调换我们

 

1、连串化的意义

  类别化
(Serialization)将对象的情形消息管理为字节流,以便于积攒或传输到内部存款和储蓄器、数据库或文件的多少个经过。在种类化时期,对象将其日前情景写入到权且或持久性存款和储蓄区,主要目标是保存对象的状态。便于日后从该情状中开始展览还原,成立新的靶子,那个历程又称作反连串化。

 

一.1 系列化的专门的学业措施

威尼斯人线上娱乐 1

图1.1-1

 

威尼斯人线上娱乐 2

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

 

目录

  • 序列化
  • 封存对象数据

 

一.2 用于系列化

  我们在数据交流的时候常实行种类化保存对象的多寡新闻,在供给运用它的时候再开始展览反类别化重新读取对象的新闻并张开校验和仓库储存的一对干活。常用来
Web 间传递数据,跨域传递,ASP .NET 后台代码往前端传递数据(js
实行分析管理)。

 

一、序列化

  系列化是将目的管理为字节流以存款和储蓄对象或传输到内部存款和储蓄器、数据库或文件。其主要目标是保留对象的场合,以便能够在需求时再也创设对象。相反的进度称为反类别化。
 

一.3 使对象可种类化

  实行连串化的操作,须求:一个带体系化的对象,四个是富含种类化对象的流和八个种类化器(Formatter)。

  大家进行编辑的类中,默许会给类增加 SerializableAttribute 特性的,当然你也得以动用显式的格局展开加多。当您策画对二个对象实行类别化时,如若它不带有 SerializableAttribute,将会吸引那多少个。在一些时候,大家恐怕不希望类中的有些字段或性质实行类别化操作,你能够在该字段或质量上行使 NonSerializedAttribute ,以告知体系化器不对它们实行种类化操作。

 

  【备注】固然已种类化的类中隐含了其他类对象的引用,而那些类又刚好也有
SerializableAttribute,那么它们也会被开始展览系列化。

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

 

  这里介绍1种普及的种类化和一种不常见的种类化:

  (一)二进制种类化:使用2进制编码来扭转精简的类别化,会体系化全数成员,并抓实质量。常用来存款和储蓄和
socket 传输。

  (二)XML
体系化:可读性更加高,也就象征有更加高的油滑,操作的便利性。可用 XmlSerializer 实行连串化操作。

 

 


1.一 体系化的行事措施

  此图呈现种类化的全体进度。 图一.1-1

  威尼斯人线上娱乐 3
  对象被系列化为流。流传递的不光是数量,还包括有关对象类型的新闻,如目的的版本、区域性和顺序集名称。通过该流,能够将目的存款和储蓄在数据库、文件或内部存款和储蓄器中。

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

  这里运用
demo 举办简易演示怎么着对目标进行种类化和反类别化操作。

 

一.二 用于体系化

  通过连串化,开拓职员能够保存对象的事态,并在须要时再次创建该目标,从而提供对象的蕴藏以及数据沟通。通过类别化,开采人士还能够举办类似如下的操作:通过
Web 服务将目的发送到远程应用程序、将对象从七个域传递到另二个域、以 XML
字符串的花样跨防火墙传递对象,只怕跨应用程序维护安全新闻或用户特定新闻。

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

威尼斯人线上娱乐 4威尼斯人线上娱乐 5

 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         }

威尼斯人线上娱乐 6

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

威尼斯人线上娱乐 7

图2-2

 

一.叁 使对象可类别化

  若要类别化对象,您须要待体系化的目的、要包含种类化对象的流,以及二个 Formatter。 System.Runtime.Serialization包括系列化和反体系化对象所需的类。
  将 SerializableAttribute 性格应用于三个系列可提示该项目标实例能够体系化。尝试系列化时,假设类型未有 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         }

威尼斯人线上娱乐 8

图2-3

  反连串化时也利用 SoapFormatter 就能够,结果同图二-二。

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

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

  【备注】2进制格式对于大多数Windows 应用程序均适用。对于在此在此以前来讲,使用
Web 应用程序恐怕是 Web 服务,建议选取 SOAP 的 XML
实行传输。而近来,当然是利用大众化的 json
格式实行传输啦。

 

  一样,也能够通过 XmlSerializer 将目标类别化保存在
XML 文件。大家能够依据供给选择适宜的种类化器,操作基本是壹致的。

 

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

  能够运用2进制系列化或 XML
种类化。在二进制体系化中,会系列化全体成员(以至包含那一个只读成员),从而能够增加质量。XML
系列化提供了可读性越来越好的代码,并在对象共享和使用方面提供了越来越大的灵活性,以便达成互操作性。

商议纷繁

  @hi丶小时候 使用
SerializableAttribute
特性时,是不提出使用自动属性的,连串化后的字段都是多出
k_BackingField<> 一多少个字符,借使目标不小会浪费一部分流量,提议利用
DataContractAttribute 和 DataMemberAttribute

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

 

 


【参考】

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

 

一.三.2 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 音讯。

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

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

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

  基本体系化的无可比拟须求是目标必须使用 SerializableAttribute 本性。 NonSerializedAttribute 可用于禁止种类化特定字段。

  使用基本体系化时,对象的版本调节恐怕会发生难点,在那种气象下,自定义系列化或然更适用。基本连串化是实践种类化的最轻便易行的不二秘诀,但对进程提供的调整并不多。

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

  在自定义连串化中,可以规范地钦点将体系化哪些对象以及哪些达成种类化。类必须标志为 SerializableAttribute,并达成 ISerializable 接口。
  假使指望一样以自定义方式反连串化对象,则必须运用自定义构造函数。

壹.三.陆 设计器类别化

  设计器体系化是一种格外方式的系列化,它关系常见与开辟工具关联的靶子持久性的品类。设计器类别化是将目标图调换为随后可用于复苏对象图的源文件的长河。源文件能够分包代码、标志,以至饱含
SQL 表音讯。有关越多音讯,请参见Designer Serialization Overview。  


2、保存对象数据

  纵然你可以在安插时将目的的习性设置为暗中同意值,然而,要是该对象被损环,则在运作时输入的全数值均会丢掉。 能够选择连串化在实例之间保持对象数据,从而可以存款和储蓄值并且在下次实例化对象时追寻这么些值。
  在本练习中,将开创1个回顾的对象,并将该目的的数量保存到文件中。然后,当你再次成立对象时将从该文件检索数据。最终,将修改代码以应用
SOAP 格式保持对象。  

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

威尼斯人线上娱乐 9 1
[Serializable] //将类标识为可体系化 二 public class Coupon :
INotifyPropertyChanged 三 { 4 public decimal Amount { get; set; } 5 陆public float InterestRate { get; set; } 七 8 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()]
//将可体系化的类中的某字段标志为不被种类化 2三 public event
PropertyChanged伊芙ntHandler PropertyChanged; 二4 贰5 public Coupon(decimal
amount, float interestRate, int term, string name) 2陆 { 二7 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地图