Json.NET 序列化回调中的 StreamingContext 参数有啥用?

Posted

技术标签:

【中文标题】Json.NET 序列化回调中的 StreamingContext 参数有啥用?【英文标题】:What is the use of the StreamingContext parameter in Json.NET Serialization Callbacks?Json.NET 序列化回调中的 StreamingContext 参数有什么用? 【发布时间】:2014-12-23 04:52:32 【问题描述】:

我试图了解应该包含在 Json.NET 序列化回调中的 StreamingContext 参数是什么,首先我以为你会允许我访问正在读取的当前 json 树,但它似乎不是,我尝试了 JSON 对象的可能排列,但没有一个我可以从 StreamingContext 参数中得到任何东西。

这是一个例子,说明我在做什么,如果我错了,请纠正我:

using System;
using System.Runtime.Serialization;
using Newtonsoft.Json;

namespace Testes

    public class Program
    
        [JsonObject(MemberSerialization.OptIn)]
        public class Person
        
            [JsonProperty("id")]
            public int Id  get; set; 

            [JsonProperty("name")]
            public string Name  get; set; 

            [JsonProperty("age")]
            public int Age  get; set; 

            [OnDeserialized]
            internal void OnDeserializedMethod(StreamingContext context)
            
                Console.WriteLine(String.Format("OnDeserialized: 0", context.Context));
            

            [OnDeserializing]
            internal void OnDeserializingMethod(StreamingContext context)
            
                Console.WriteLine(String.Format("OnDeserializing: 0", context.Context));
            
        

        public static void Main(string[] args)
        
            var lucy = JsonConvert.DeserializeObject<Person>(" 'id': 1, 'name': 'Lucy', 'age': 22 ");

            Console.ReadKey();
        
    

【问题讨论】:

【参考方案1】:

好问题。我自己也经常想知道这一点,所以你启发了我去找出答案。

通过 Json.Net source code 搜索,似乎StreamingContext 并没有真正被序列化程序使用太多,而只是从序列化程序设置传递到可能需要它的其他地方。我猜这是为了支持 .NET ISerializable 接口而添加的,该接口要求实现者提供一个接受StreamingContext 的构造函数。 Json.Net 默认提供一个空的StreamingContext,但如果需要,您可以在设置中显式设置它。您可以通过对 Main 方法的小改动来亲自查看:

public static void Main(string[] args)

    JsonSerializerSettings settings = new JsonSerializerSettings
    
        Context = new StreamingContext(StreamingContextStates.Other, "foo")
    ;

    var json = @" ""id"": 1, ""name"": ""Lucy"", ""age"": 22 ";
    var lucy = JsonConvert.DeserializeObject<Person>(json, settings);

    Console.ReadKey();

输出:

OnDeserializing: foo
OnDeserialized: foo

简而言之,StreamingContext 参数在大多数情况下不会很有用(因为它默认为空)。它绝对不提供对正在序列化或反序列化的 JSON 树的访问。

【讨论】:

【参考方案2】:

StreamingContext 是关于序列化\反序列化环境,而不是它的特定目标。 可能对密码、格式和其他自定义 s\d 逻辑很有用。

【讨论】:

以上是关于Json.NET 序列化回调中的 StreamingContext 参数有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

客户端配置文件中的 C#/.NET json 序列化程序?

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

如何在 Json.Net 中的 JsonConvert DeserializeObject 之后获取所有不存在的键?

.Net Core WebAPI:使用不同的 json 序列化器选项来反序列化同一控制器中的请求体

是否有一种开箱即用的方法来反序列化 Json.Net 中的抽象类?

Json.NET 中的 RawJSON 对象