Каково использование параметра 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.