StreamingContext 参数在 Json.NET 序列化回调中的用途是什么?

本文关键字:是什么 回调 参数 Json NET 序列化 StreamingContext | 更新日期: 2023-09-27 18:27:59

我试图了解 StreamingContext 参数

应该包含在 Json.NET 序列化回调中,首先我以为你会允许我访问正在读取的当前 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();
        }
    }
}

StreamingContext 参数在 Json.NET 序列化回调中的用途是什么?

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

搜索 Json.Net 源代码,似乎序列化程序根本没有真正使用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 树的访问。

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