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# 通过json.net中的JsonConverter进行自定义序列化与反序列化
如何在 Json.Net 中的 JsonConvert DeserializeObject 之后获取所有不存在的键?
.Net Core WebAPI:使用不同的 json 序列化器选项来反序列化同一控制器中的请求体