【问题标题】:Serialization DataMember (name) override issue序列化 DataMember(名称)覆盖问题
【发布时间】:2011-09-12 19:07:59
【问题描述】:

我正在使用 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 并在派生类上添加了示例。在派生类上做这件事对我来说似乎是合乎逻辑的(尤其是对于继承问题)。什么是正确的?

【问题讨论】:

    标签: c# wcf serialization overriding datamember


    【解决方案1】:

    我也有同样的问题。我使用的是 VB.NET,我必须隐藏(或重载)该属性以使 WCF 尊重派生类中的 DataMember 属性。在 C# 中,您应该能够使用 new 运算符。

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

    【讨论】:

    • 请注意,为避免在 json 中创建两个字段,您需要从基类的属性中删除 [DataMember] 属性。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多