我想了解在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
接口,其合同要求实现者提供接受StreamingContext的构造函数. Json.Net默认提供一个空的StreamingContext,但是如果需要,可以在设置中显式设置它.您可以通过对主方法的一个小的改动来看到这一点:
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树的访问.