2011-09-12 80 views
12

我正在使用DataContractJsonSerializer並且DataMember名稱存在問題。序列化DataMember(名稱)覆蓋問題

我做了一個基類和幾個派生類。我需要派生類,因爲我有不同的JSON字符串。我想反序列化json字符串,因此需要數據成員的不同名稱。我試圖改變數據成員名稱,如下面的例子:

基類:

[DataContract] 
public abstract class BaseClass 
{ 


    [DataMember] 
    public virtual string FirstMethod { get; protected set; } 

} 

派生類:

[DataContract] 
[KnownType(typeof(BaseAccess))] 
public class DerivedClass 
{ 


    [DataMember(Name="first_method")] 
    public virtual string FirstMethod { get; protected set; } 

} 

問題是,當我用一個派生類的序列化似乎忽略給定的DataMember名稱。所以當我使用類型DerivedClass反序列化時,序列化似乎是以名稱「FirstMethod」(基類的名稱)而不是「first_method」(派生類的名稱)進行的。是否可以使用派生類的DataMember名稱(在我的情況下,這對於多個派生類而言是不同的)。

另一個問題。我發現在基類中添加了KnownType的示例,並將其添加到派生類中。似乎邏輯對我來說是在派生類上做的(特別是對於繼承問題)。什麼是正確的?

回答

7

我有這個相同的問題。我正在使用VB.NET,我不得不Shadow(或重載)屬性讓WCF尊重派生類中的DataMember屬性。在C#中,您應該可以使用新的操作符。

public class DerivedClass 
{ 
    [DataMember(Name = "first_method")] 
    new public string FirstMethod { get; protected set; } 
} 
+0

請注意,爲避免在json中創建兩個字段,您需要從基類中的屬性中刪除[DataMember]屬性。 –

3

訣竅是基類的虛擬數據成員指定EmitDefaultValue = false,並在其派生類返回默認值實現,因此數據成員不是序列。在派生類中定義具有所需名稱的另一個數據成員。

[DataContract(Name = "baseclass", Namespace = "")] 
[KnownType(typeof(DerivedClass))] 
public class BaseClass 
{ 
    [DataMember(Name = "attributes", EmitDefaultValue = false)] 
    public virtual SomeType Fields { get; set; } 
} 

[DataContract(Name = "derivedclass", Namespace = "")] 
public class DerivedClass : BaseClass 
{ 
    public override SomeType Fields 
    { 
     get { return null; } 
    } 

    [DataMember(Name = "fields")] 
    public SomeType DerivedFields 
    { 
     get { return base.Fields; } 
    } 
}