2012-03-07 25 views
0

我想在确定从CustomCreationConverter返回的正确类型时访问当前目标对象的其他反序列化属性值。如何访问CustomCreationConverter.Create()中的反序列化上下文?

I.e.在下面的BeeConverter.Create()方法中,我想访问GetCurrentTarget()这样的东西,它会让我回到(部分填充的)当前对象实例。是否可能有某个事件或回调让我可以存储ref到当前目标?

在此先感谢。

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); 
相关问题