首页 文章

序列化DataMember(名称)覆盖问题

提问于
浏览
12

我正在使用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并在派生类上添加的示例 . 对于我来说,在派生类上执行此操作似乎是逻辑(特别是对于继承问题) . 什么是正确的?

2 回答

  • 3

    我有同样的问题 . 我使用的是VB.NET,我不得不使用Shadow(或Overload)属性来让WCF尊重派生类中的DataMember属性 . 在C#中,您应该能够使用new运算符 .

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

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

相关问题