我正在使用DataContractJsonSerializer,并且DataMember名称存在问题。
我创建了一个基类和几个派生类。我需要派生类,因为我有不同的json字符串。我想反序列化json字符串,因此需要不同的数据名称名称。我尝试更改DataMember名称,如下例所示:
基类:
[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并在派生类上添加的示例。对于我来说,在派生类上执行此操作似乎是逻辑(特别是对于继承问题)。什么是正确的?
答案 0 :(得分:7)
我有同样的问题。我使用的是VB.NET,我不得不使用Shadow(或Overload)属性来让WCF尊重派生类中的DataMember属性。在C#中,您应该能够使用new运算符。
public class DerivedClass
{
[DataMember(Name = "first_method")]
new public string FirstMethod { get; protected set; }
}
答案 1 :(得分: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; }
}
}