2012-03-07 2 views
0

Я хотел бы получить доступ к другим значениям десериализованного свойства текущего целевого объекта при определении правильного типа для возврата из CustomCreationConverter.Как я могу получить доступ к контексту десериализации в CustomCreationConverter.Create()?

I.e. в методе BeeConverter.Create() ниже я хочу получить доступ к чему-то вроде GetCurrentTarget(), который вернет мне (частично заполненный) текущий экземпляр объекта. Возможно, есть какое-то событие или обратный вызов, который позволяет мне хранить ссылку на текущую цель?

Заранее спасибо.

public class B 
{ 
    public int IntProp; 
} 

public class D1 : B 
{ 
    public string StringProp; 
} 

public class D2 : B 
{ 
    public decimal DecimalProp; 
} 

public class Thingy 
{ 
    public int Selector; 
    public B DerivedProp; 
} 

public class BeeConverter : CustomCreationConverter<B> 
{ 
    public override B Create(Type objectType) 
    { 
     var theThingy = GetCurrentTarget(); 
     if (theThingy == null) return null; 
     return theThingy.Selector == 1 ? new D1() as B : new D2(); 
    } 

    private Thingy GetCurrentTarget() 
    { 
     // ???? 
    } 
} 

public class ConverterTests : TestFixtureBase 
{ 
    [Test] 
    public void CanDeserializeDerivedType() 
    { 
     var testObject = new Thingy { Selector = 1, DerivedProp = new D1 { StringProp = "42" } }; 
     string stream = JsonConvert.SerializeObject(testObject); 
     var result = JsonConvert.DeserializeObject<Thingy>(stream, new BeeConverter()); 
     Assert.IsInstanceOfType(typeof(D1), result.DerivedProp); 
     Assert.AreEqual("42", (result.DerivedProp as D1).StringProp); 
    } 
} 

ответ

1

Проделали еще несколько исследований, и, похоже, это не жизнеспособный подход. Принятым способом обработки производных типов в потоке сериализации является использование класса JsonSerializerSettings:

var settings = new JsonSerializerSettings(); 
settings.TypeNameHandling = TypeNameHandling.Auto; 
string stream = JsonConvert.SerializeObject(testObject, Formatting.None, settings); 
// ... 
TestClass result = JsonConvert.DeserializeObject<TestClass>(stream, settings); 
Смежные вопросы