2014-10-27 4 views
14

Json.NET Serialization Geri Arama'da içerdiği StreamingContext parametresinin neyi içerdiğini anlamaya çalışıyorum, önce okunmakta olan geçerli json ağacına erişmeme izin vereceğinizi düşündüm, ama öyle görünmüyor, JSON nesneleri düzenlemelerini denedim ancak hiçbiri StreamingContext parametresinden bir şey elde edemedim.Json.NET Serialization Geri Arama'da StreamingContext parametresinin kullanımı nedir?

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

cevap

11

İyi soru: Burada

yanılıyorsam beni düzeltin lütfen yapıyor olmanın ne gösteren bir örnektir. Bunu kendim çok merak ettim, bu yüzden öğrenmek için bana ilham verdin.

Json.Net source code ile arama yaptığınızda, StreamingContext dizininin gerçekten çok fazla kullanılmadığı anlaşılıyor, ancak bunun yerine seri hale getirici ayarlarından gereksinim duyabilecek başka yerlere aktarılıyor. Benim tahminim, StreamingContext kabul eden bir kurucu sağlamak için uygulayıcıları gerektirir .NET ISerializable arabirimini desteklemek için eklenmiştir. Json.Net varsayılan olarak boş bir StreamingContext sağlar, ancak gerekiyorsa ayarları açık bir şekilde ayarlamanızı sağlar. Eğer Main yöntemine küçük bir değişiklikle bu kendinizi görebilirsiniz:

Çıktı
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(); 
} 

: Kısacası

OnDeserializing: foo 
OnDeserialized: foo 

, StreamingContext parametre olduğundan (çoğu durumda çok yararlı olabilir gitmiyor varsayılan olarak boş). Kesinlikle serileştirilmiş veya serileştirilmiş JSON ağacına erişim sağlamaz.

0

StreamingContext, serialization \ deserialization ortamı hakkında değil, belirli bir hedeftir. Parolalar, biçimler ve diğer özel s \ d mantığı için kullanışlıdır.