Сериализация DataMember (имя) проблема переопределения - PullRequest
12 голосов
/ 12 сентября 2011

Я использую 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; }

}

Проблема заключается в том, что при использовании производногоclass сериализация, кажется, игнорирует данное имя DataMember.Поэтому, когда я десериализую с типом DerivedClass, кажется, что сериализация происходит с именем «FirstMethod» (из базового класса) вместо «first_method» (из производного класса).Можно ли использовать имя DataMember производного класса (которое отличается для нескольких производных классов в моей ситуации).

Другой вопрос.Я нашел примеры с KnownType, добавленным в базовый класс и добавленным в производный класс.Мне кажется логичным делать это на производном классе (особенно для наследования).Что правильно?

Ответы [ 2 ]

7 голосов
/ 14 января 2012

У меня была такая же проблема.Я использовал VB.NET, и мне пришлось скрыть (или перегрузить) свойство, чтобы WCF соблюдал свойство DataMember в моем производном классе.В C # вы должны использовать новый оператор.

public class DerivedClass
{
    [DataMember(Name = "first_method")]
    new public string FirstMethod { get; protected set; }
}
3 голосов
/ 13 ноября 2012

Хитрость заключается в том, чтобы указать 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; }
    }
}
...