c# - Json.NET Serialization Callbacks 中的 StreamingContext 参数有什么用?

标签 c# json json.net deserialization

我试图了解 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();
        }
    }
}

最佳答案

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

通过 Json.Net 搜索 source code ,似乎 StreamingContext 根本没有被序列化器真正使用太多,而只是从序列化器设置传递到可能需要它的其他地方。我的猜测是添加它是为了支持 .NET ISerializable接口(interface),其契约要求实现者提供接受 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 树的访问。

关于c# - Json.NET Serialization Callbacks 中的 StreamingContext 参数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597244/

相关文章:

c# - 使用 Newtonsoft、dotnet core 2.2 与 dot net core 3.1 对 System.Version 进行序列化和反序列化

c# - 将名称值对添加到 JArray 中的 JObject

c# - 通用类型 JsonConvert.DeserializeObject<List<T>>(string)

c# - 如何使用 C# 在 MonoMac 中打开一个窗口作为模态对话框?

c# - 在虚拟机上获取 CPU ID

c# - 代码隐藏的样式表问题

php - 从 JSON URL 解析数据

c# - 使用 C# 逆透视数据集

php - JSON 解码嵌套数组 PHP 循环

c++ - 如何使用rapidjson C++检索JSON文件中的键值数据?