在Json.NET序列化回调中使用StreamingContext参数有什么用?

时间:2014-10-27 21:33:28

标签: 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();
        }
    }
}

2 个答案:

答案 0 :(得分:14)

好问题。我自己经常想到这一点,所以你激励我去发现。

通过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树的访问。

答案 1 :(得分:1)

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