2015-12-03 30 views
1

當使用DataContractSerializer反序列化XML時,我遇到了一系列基類的問題。在派生類中沒有從XML反序列化:帶繼承的c#DataContractSerializer

<?xml version="1.0" encoding="utf-8" ?> 

<Page xmlns="Renishaw.Page"> 
    <Fields> 
    <Field Value="Welcome"/> 
    <LanguageField Value="English"/> 
    </Fields> 

    <Buttons> 
    <CancelButton/> 
    <BackButton/> 
    <NextButton/> 
    </Buttons> 

    <ChildPath>D:\SerializeTest\Console\bin\Debug\XML\Content\Next\Next\Page.xml</ChildPath> 
</Page> 

以下是我DataContract

[DataContract(Namespace = "Renishaw.Page")] 
internal class Page 
{ 
    [DataMember(Order=1, IsRequired = true)] 
    public List<Field> Fields { get; set; } 

    [DataMember(Order = 2, IsRequired = true)] 
    public List<Button> Buttons { get; set; } 

    [IgnoreDataMember] 
    public Page Child { get; set; } 

    [DataMember(Order = 3, IsRequired = true)] 
    private string ChildPath { get; set; } 

    [OnDeserialized] 
    private void OnDeserialized(StreamingContext context) 
    { 
     if (ChildPath.Equals("")) 
      return; 

     Child = Serializer.Deserialize<Page>(ChildPath); 
    } 

    [OnSerialized] 
    private void OnSerialized(StreamingContext context) 
    { 

    } 
} 

[DataContract] 
[KnownType(typeof(LanguageField))] 
internal class Field 
{ 
    [DataMember(Order=1)] 
    public string Value { get; set; } 
} 

[DataContract] 
internal class LanguageField : Field 
{ 

} 

[DataContract] 
[KnownType(typeof(BackButton))] 
[KnownType(typeof(CancelButton))] 
[KnownType(typeof(NextButton))] 
internal class Button 
{ 

} 

[DataContract] 
internal class BackButton : Button 
{ 

} 

[DataContract] 
internal class CancelButton : Button 
{ 

} 

[DataContract] 
internal class NextButton : Button 
{ 

} 

正是我要去哪裏錯了?是否有一種特定的方式,您需要爲繼承項目申報合同

回答

0

您應該添加DataContract名按鈕如下圖所示

[DataContract(Name="ThisIsButton")] 
[KnownType(typeof(BackButton))] 
[KnownType(typeof(CancelButton))] 
[KnownType(typeof(NextButton))] 
internal class Button 
{ 

} 

,然後添加itype你xml的

<Buttons> 
    <CancelButton itype="ThisIsButton"/> 
    <BackButton itype="ThisIsButton"/> 
    <NextButton itype="ThisIsButton"/> 
    </Buttons> 
+0

我認爲你是對的。命名空間需要應用於每個數據合同,然後i:type可以被添加到每個派生類型中,即: