序列化:
是將對象轉換為可保持或可傳輸的形式的過程。
.NET 具有以下序列化技術:
- 二進制序列化保持類型保真,這對于多次調用應用程序時保持對象狀態非常有用。 例如,通過將對象序列化到剪貼板,可在不同的應用程序之間共享對象。 您可以將對象序列化到流、磁盤、內存和網絡等。 遠程處理使用序列化,“按值”在計算機或應用程序域之間傳遞對象。
- XML 和 SOAP 序列化只序列化公共屬性和字段,并且不保持類型保真。 當您希望提供或使用數據而不限制使用該數據的應用程序時,這一點非常有用。 由于 XML 是開放式的標準,因此它對于通過 Web 共享數據來說是一個理想選擇。 SOAP 同樣是開放式的標準,這使它也成為一個理想選擇。
- JSON 序列化只序列化公共屬性,并且不保持類型保真。 JSON 是開放式的標準,對于通過 Web 共享數據來說是一個理想選擇。
用到的類:
System.Runtime.Serialization
包含可用于序列化和反序列化對象的類。
System.Xml.Serialization
包含可用于將對象序列化為 XML 格式的文檔或流的類。
System.Text.Json
包含可用于將對象序列化為 JSON 格式的文檔或流的類。
反序列化:
是將流轉換為對象的過程。
這兩個過程一起保證能夠存儲和傳輸數據。
注意:
- 如果一個類可以序列化,它的子類和包含的各成員對象不一定都可以序列化。如果一個類可以序列化,但其子類或包含的成員對象不滿足序列化條件,那么在序列化過程中可能會拋出異常。因此,在設計可序列化的類繼承結構時,需要確保所有相關的類都滿足序列化條件。
- 若要忽略單個屬性,請使用 [JsonIgnore] 特性。
示例:?
JSON序列化示例:
public class Person
{public string? Name { get; set; }public int Age { get; set; }public DateTimeOffset Date { get; set; }
}
internal class Program
{static void Main(string[] args){//創建一個Person類的對象Person person = new Person{Name = "大毛",Age = 10,Date = DateTime.Now};//序列化為JSONstring jsonString = JsonSerializer.Serialize(person);Console.WriteLine(jsonString);//{"Name":"\u5927\u6BDB","Age":10,"Date":"2024-03-03T17:01:29.4062255+08:00"}}
}
JSON反序列化示例:
public class Person
{public string? Name { get; set; }public int Age { get; set; }public DateTimeOffset Date { get; set; }
}
internal class Program
{static void Main(string[] args){string jsonString = @"{""Name"":""\u5927\u6BDB"",""Age"":10,""Date"":""2024-03-03T17:01:29.4062255+08:00""}";Person? person = JsonSerializer.Deserialize<Person?>(jsonString);Console.WriteLine($"姓名:{person?.Name}");Console.WriteLine($"年齡:{person?.Age}");Console.WriteLine($"創建時間:{person?.Date}");//姓名: 大毛//年齡:10//創建時間:2024 - 03 - 03 17:01:29 + 08:00