Использовать DataMember во время десериализации, но гайка во время сериализации? - PullRequest
0 голосов
/ 11 сентября 2018

У меня проблемы с пониманием сериализации одного из моих объектов.

Сценарий:

Я получаю данные от службы в заданном формате.Я хочу принять данные как есть.Из-за соглашений об именах я должен использовать свойства DataMember, чтобы сопоставить входящие данные с правильно названными свойствами класса.Я использую System.Runtime.Serialization для этого.Пример:

[DataContract]
public class IncomingData
{
    [DataMember(Name = "$Filename")]
    public string Filename { get; set; }
}

Это нормально работает, и данные сопоставляются с внутренним именем свойства.В какой-то момент мне пришлось снова сериализовать этот объект, и я наивно думал, что он будет сериализован с внутренним именем свойства, например,

{ "Filename":"C:\temp\lala.txt"} 

, однако это не так, и вместо него используется исходное имя свойства "$ Filename".Я предполагаю, что это потому, что DataMember работает в обоих направлениях.

Существует ли элегантный способ сериализации этого объекта с именами свойств и игнорирования DataMember?Я пытался, если работает другая библиотека сериализации (JSON.NET), но, похоже, она также следует за DataMember.

Должен ли я обернуть этот объект другим, чтобы достичь?Спасибо за любые подсказки!голуб

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете определить интерфейс для синхронизации этих объектов ...

public interface IData
{
    string Filename { get; set; }
}

// deserialize me.
[DataContract]
public class IncomingData : IData
{
    [DataMember(Name = "$Filename")]
    public string Filename { get; set; }
}

// serialize me.
public class Data : IData
{
    public string Filename { get; set; }
}

... или использовать виртуальные свойства и переопределить их с атрибутами сериализации ...

// serialize me.
class Data
{
    public virtual string Filename { get; set; }
}

// deserialize me.
[DataContract]
class IncomingData : Data
{
    [DataMember(Name = "$Filename")]
    public override string Filename { get => base.Filename; set => base.Filename = value; }
}

... оба эти метода потребуют использования сопоставителя, такого как AutoMapper, для клонирования IncomingData в класс без атрибутов Data class ...

mapper.Map<IncomingData, Data>(user);

...поэтому я ценю, что это кажется не идеальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...