序列化是将对象处置惩罚为字撙节以存储对象或传输到内存、数据库或文件。其主要目标是保留对象的状况,以便可以在须要时从新建立对象。相反的历程称为反序列化。
1.1 序列化的工作体式格局
此图显现序列化的全部历程。
对象被序列化为流。流通报的不仅是数据,还包括有关对象范例的信息,如对象的版本、区域性和顺序集称号。经由过程该流,可以将对象存储在数据库、文件或内存中。
1.2 用于序列化
经由过程序列化,开发人员可以保留对象的状况,并在须要时从新建立该对象,从而供应对象的存储以及数据交换。经由过程序列化,开发人员还可以实行相似以下的操纵:经由过程 Web 效劳将对象发送到长途运用顺序、将对象从一个域通报到另一个域、以 XML 字符串的情势跨防火墙通报对象,或许跨运用顺序保护平安信息或用户特定信息。
1.3 使对象可序列化
若要序列化对象,您须要待序列化的对象、要包括序列化对象的流,以及一个 Formatter。 System.Runtime.Serialization包括序列化和反序列化对象所需的类。
将 SerializableAttribute 特征运用于一个范例可指导该范例的实例可以序列化。尝试序列化时,假如范例没有 SerializableAttribute 特征,将激发SerializationException 非常。
假如不愿望类中的字段可序列化,请运用 NonSerializedAttribute 特征。假如可序列化范例的字段包括指针、句柄或其他一些专用于特定环境的数据结构,而且不能在差别的环境中以有意义的体式格局重修,则可以须要使该字段不可序列化。
假如已序列化的类包括对标记为 SerializableAttribute 的其他类的对象的援用,则也将序列化这些对象。
1.3.1 二进制序列化和 XML 序列化
可以运用二进制序列化或 XML 序列化。在二进制序列化中,会序列化一切成员(以至包括那些只读成员),从而可以进步机能。XML 序列化供应了可读性更好的代码,并在对象同享和运用方面供应了更大的灵活性,以便完成互操纵性。
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 是一种基于 XML 的协定,它是特地为运用 XML 来传输历程挪用而设想的。犹如通例的 XML 序列化,特征可用于掌握 XML Web services 生成的文本款式的 SOAP 音讯。
1.3.5 基本序列化和自定义序列化
可以经由过程两种体式格局实行序列化:基本序列化和自定义序列化。基本序列化运用 .NET Framework 来自动序列化对象。
1.3.5.1 基本序列化
基本序列化的唯一要求是对象必需运用 SerializableAttribute 特征。
NonSerializedAttribute 可用于制止序列化特定字段。
运用基本序列化时,对象的版本掌握可以会发生题目,在这类情况下,自定义序列化可以更适宜。基本序列化是实行序列化的最简朴的要领,但对历程供应的掌握并不多。
1.3.5.2 自定义序列化
在自定义序列化中,可以正确地指定将序列化哪些对象以及怎样完成序列化。类必需标记为 SerializableAttribute,并完成 ISerializable 接口。
假如愿望一样以自定义体式格局反序列化对象,则必需运用自定义组织函数。
1.3.6 设想器序列
设想器序列化是一种特别情势的序列化,它触及一般与开发工具关联的对象持久性的品种。设想器序列化是将对象图转换为今后可用于恢复对象图的源文件的历程。源文件可以包括代码、标记,以至包括 SQL 表信息。有关更多信息,请拜见Designer Serialization Overview。
二、经由过程序列化保留对象数据
虽然您可以在设想时将对象的属性设置为默认值,然则,假如该对象被损环,则在运行时输入的一切值均会丧失。 可以运用序列化在实例之间坚持对象数据,从而可以存储值而且在下次实例化对象时检索这些值。
在本练习训练中,将建立一个简朴的对象,并将该对象的数据保留到文件中。然后,当您从新建立对象时将从该文件检索数据。末了,将修正代码以运用 SOAP 花样坚持对象。
2.1 运用序列化保留对象
[Serializable] //将类标记为可序列化 public class Coupon : INotifyPropertyChanged { public decimal Amount { get; set; } public float InterestRate { get; set; } public int Term { get; set; } private string _name; public string Name { get { return _name; } set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer")); } } [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化 public event PropertyChangedEventHandler PropertyChanged; public Coupon(decimal amount, float interestRate, int term, string name) { Amount = amount; InterestRate = interestRate; Term = term; _name = name; } } static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new BinaryFormatter(); //二进制花样序列化器 deserializer.Serialize(stream, coupon); //序列化对象到文件中 } }
如今尝试反序列化,看看与之前 Coupon 对象的值是不是一致。
static void Main(string[] args) { const string fileName = @"demo1.txt"; //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); //推断该文件是不是存在 if (!File.Exists(fileName)) { return; } using (var stream = File.OpenRead(fileName)) { var deserializer = new BinaryFormatter(); //二进制序列化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化 if (coupon == null) { return; } Console.WriteLine($"{nameof(Coupon)}:"); Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}"); Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%"); Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}"); Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}"); } Console.Read(); }
2.2 运用 SOAP 花样保留对象
static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new SoapFormatter(); //Soap 花样化器 deserializer.Serialize(stream, coupon); //序列化 } }
反序列化时也采纳 SoapFormatter 即可
var deserializer = new SoapFormatter(); //Soap 花样化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
【注重】本示例将数据存储到二进制或 SOAP 花样的文件中。不应将这些花样用于敏感数据,如暗码或信用卡信息。
【备注】二进制花样关于大多数 Windows 运用顺序均实用。但关于 Web 运用顺序或 Web 效劳,您可以愿望运用 SOAP 花样将对象保留到 XML 文件中,以使对象易于同享。
一样,也可以经由过程 XmlSerializer 将对象序列化保留在 XML 文件。我们可以依据需求挑选适宜的序列化器,操纵基本是一样的。
以上就是C#编程基本之序列化的内容,更多相关内容请关注ki4网(www.ki4.cn)!