序列化datammember (name)覆盖问题

本文关键字:覆盖 问题 name datammember 序列化 | 更新日期: 2023-09-27 18:08:27

我正在使用一个DataContractJsonSerializer,并且有一个datammember Name的问题。

我做了一个基类和几个派生类。我需要派生类,因为我有不同的json字符串。我想要反序列化json字符串,因此需要为数据成员使用不同的名称。我尝试更改DataMember的名称,如下例所示:

Baseclass:

[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的例子。对我来说,在派生类上这样做似乎是合乎逻辑的(特别是对于继承问题)。什么是正确的?

序列化datammember (name)覆盖问题

我也有同样的问题。我用的是VB。. NET和我不得不遮蔽(或重载)属性,以使WCF尊重我的派生类中的DataMember属性。在c#中,你应该能够使用new操作符。

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

技巧是为基类的虚拟数据成员指定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; }
    }
}