Каково использование параметра StreamingContext в Json.NET Serialization Callbacks?

Я пытаюсь понять, какой параметр StreamingContext должен содержаться в Json.NET Serialization Callbacks, сначала я думал, что вы разрешите мне доступ к текущему 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 , похоже, что 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.