c# – 在Json.NET序列化回调中使用StreamingContext参数?

前端之家收集整理的这篇文章主要介绍了c# – 在Json.NET序列化回调中使用StreamingContext参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想了解在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树的访问.

猜你在找的C#相关文章