序列化和反序列化

序列化是将对象状态转换为可保持或传输的形式的过程。 序列化的补集是反序列化,后者将流转换为对象。 这两个过程一起保证能够存储和传输数据。
.NET 具有以下序列化技术:

  • 二进制序列化保持类型保真,这对于多次调用应用程序时保持对象状态非常有用。 例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。 您可以将对象序列化到流、磁盘、内存和网络等。 远程处理使用序列化,“按值”在计算机或应用程序域之间传递对象。 ```csharp using System.IO; using System.Runtime.Serialization.Json; using System.Text;

namespace DbgTechnology.Utility { ///

/// Json帮助类 /// public class JsonHelp { /// /// JSON序列化(二进制方式,实体类使用[Serializable]) /// /// /// /// public static string JsonSerializerIo(T t) { var ser = new DataContractJsonSerializer(typeof(T)); using var ms = new MemoryStream(); ser.WriteObject(ms, t); var jsonString = Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); return jsonString; }

  1. /// <summary>
  2. /// JSON反序列化(二进制方法,实体类使用[Serializable])
  3. /// </summary>
  4. /// <typeparam name="T"></typeparam>
  5. /// <param name="jsonString"></param>
  6. /// <returns></returns>
  7. public static T JsonDeserializeIo<T>(string jsonString)
  8. {
  9. var ser = new DataContractJsonSerializer(typeof(T));
  10. using var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
  11. var obj = (T)ser.ReadObject(ms);
  12. return obj;
  13. }
  14. }

}

调用方法: iSOCustomDeleteFileAddittion.FileInfo = JsonHelp.JsonSerializerIo(req.FileInfo); var jsonData = JsonHelp.JsonDeserializeIo(responsePost.Content);


- [XML 和 SOAP 序列化](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/xml-and-soap-serialization)只序列化公共属性和字段,并且不保持类型保真。 当您希望提供或使用数据而不限制使用该数据的应用程序时,这一点非常有用。 由于 XML 是开放式的标准,因此它对于通过 Web 共享数据来说是一个理想选择。 SOAP 同样是开放式的标准,这使它也成为一个理想选择。
- [JSON 序列化](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-overview)只序列化公共属性,并且不保持类型保真。 JSON 是开放式的标准,对于通过 Web 共享数据来说是一个理想选择。
<a name="NtjQS"></a>
# System.Text.Json
System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。<br />库的设计强调对广泛的功能集实现高性能和低内存分配。 内置的 UTF-8 支持可优化读写以 UTF-8 编码的 JSON 文本的过程,UTF-8 编码是针对 Web 上的数据和磁盘上的文件的最普遍的编码方式。<br />库还提供了用于处理内存中[文档对象模型 (DOM)](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-use-dom-utf8jsonreader-utf8jsonwriter#json-dom-choices) 的类。 此功能允许对 JSON 文件或字符串中的元素进行随机访问。<br />【运行时反射与编译时源生成】<br />默认情况下,System.Text.Json 使用运行时System.Text.Json来收集访问对象属性以进行序列化和反序列化时所需的元数据。 作为替代方法,System.Text.Json 可以使用 C# System.Text.Json功能来提高性能、降低专用内存使用量以及推动[程序集修整](https://docs.microsoft.com/zh-cn/dotnet/core/deploying/trimming/trim-self-contained),从而缩小应用大小。 <br />【如何获取库】<br />该库是作为 .NET Core 3.0 及更高版本共享框架的一部分内置的。 源生成功能内置在 .NET 6 和更高版本的共享框架中。 使用源生成需要具有 .NET 5 SDK 或更高版本。<br />对于早于 .NET Core 3.0 的框架版本,请安装 [System.Text.Json](https://www.nuget.org/packages/System.Text.Json) NuGet 包。 包支持以下框架:

- .NET Standard 2.0 及更高版本
- .NET Framework 4.7.2 及更高版本
- .NET Core 2.1 及更高版本
- .NET 5 及更高版本

【线程安全】

- System.Text.Json 类型是线程安全的,包括:
- [JsonSerializer](https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.jsonserializer)
- [Utf8JsonReader](https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.utf8jsonreader)
- [Utf8JsonWriter](https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.utf8jsonwriter)
- [JsonDocument](https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.jsondocument)
- [JsonNode](https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.nodes.jsonnode)

相关资料:<br />[https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-overview?pivots=dotnet-6-0](https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-overview?pivots=dotnet-6-0)
```csharp
[Route("GetJson")]
[HttpGet]
public IActionResult GetJson()
{
    Product product = new()
    {
        Name = "Apple",
        ExpiryDate = new DateTime(2008, 12, 28),
        Price = 3.99M,
        Sizes = new string[] { "Small", "Medium", "Large" }
    };

    //序列化
    string output = System.Text.Json.JsonSerializer.Serialize(product);
    /* 2008-12-28T00:00:00 日期带有T
    {"Name":"Apple","ExpiryDate":"2008-12-28T00:00:00","Price":3.99,"Sizes":["Small","Medium","Large"]}
    */

    //反序列化
    var deserializedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(output);

    return Ok(output);
}

Newtonsoft.Json

开源的Json库,非常灵活。
https://www.newtonsoft.com/json
官网已包含所有的教程,可以深入学习。

[Route("GetJson")]
[HttpGet]
public IActionResult GetJson()
{
    Product product = new()
    {
        Name = "Apple",
        ExpiryDate = new DateTime(2008, 12, 28),
        Price = 3.99M,
        Sizes = new string[] { "Small", "Medium", "Large" }
    };

    //序列化
    string output = JsonConvert.SerializeObject(product);
    /* 2008-12-28T00:00:00 日期带有T
    {"Name":"Apple","ExpiryDate":"2008-12-28T00:00:00","Price":3.99,"Sizes":["Small","Medium","Large"]}
    */

    //反序列化
    var deserializedProduct = JsonConvert.DeserializeObject<Product>(output);

    return Ok(output);
}

主要区别

微软的默认转换规则十分严格,主要强调性能和安全性,对于不安全操作直接不支持。
开源的默认转换规则十分灵活,主要强调的就是灵活性,支持推测类型、派生类等等。
当首先使用开源版本的,那么就很难切换会微软官方的,因为太方便。
详细区别可参考如下文档
https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to?pivots=dotnet-5-0