2012-03-07 57 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);