阅读目录
4.2、使用System.Text.Json序列化&反序列化
4.4、System.Text.Json和Newtonsoft.Json的一些差异
序列化:将对象的状态信息及类型信息,转换为一种易于传输或存储形式(流,即字节序列)的过程。
反序列化:与序列化相反,将流转换为对象的过程。
.NET有以下序列化技术:
二进制序列化:保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。 例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。 您可以将对象序列化到流、磁盘、内存和网络等。 远程处理使用序列化,“按值”在计算机或应用程序域之间传递对象。
XML和SOAP序列化:只序列化公共属性和字段,并且不保持类型保真。 当您希望提供或使用数据而不限制使用该数据的应用程序时,这一点非常有用。 由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。 SOAP 同样是开放式的标准,这使它也成为一个理想选择。
JSON序列化:只序列化公共属性,并且不保持类型保真。 JSON 是开放式的标准,对于通过 Web 共享数据来说是一个理想选择。
二进制序列化是将.NET对象转换为数据流,存放到内存中。需要注意两点:①二进制序列化的时候,可以将对象的所有属性进行序列化,包括私有属性。②在反序列化的时候,不会调用无参的构造函数,可以借用这点来进行对象的深拷贝。序列化和反序列化可以通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。要使一个类能够序列化,需要使用Serializable属性标记类,如果不想被二进制序列化,在属性字段上使用NonSerialized标记。
1 [Serializable] 2 public class SerializeObject 3 { 4 public string Name { get; set; } 5 //二进制序列化会把所有的属性字段都序列化,包括私有private, 6 //如果不想序列化,使用特性[NonSerialized] 7 private string _desc { get; set; } 8 public int _Age; 9 [NonSerialized] 10 private bool _sex; 11 public SerializeObject(string name,string desc,int age,bool sex) 12 { 13 this.Name = name; 14 this._desc = desc; 15 this._Age = age; 16 this._sex = sex; 17 } 18 }