Как сериализовать тип, полученный из ConfigurationSection, с помощью NetDataContractSerializer

Я написал свой тип, производный от ConfigurationSection, пометил все свойства DataMember, а класс - DataContract, однако программа вылетает из-за того, что я не могу наследовать свой тип от типа, который не отмечен DataContract.

Итак, как я могу использовать этот сериализатор с ConfigurationSection?

[DataContract]
public sealed class MyConfig : ConfigurationSection
{
    [DataMember]
    [ConfigurationProperty("ConnectionTimeout", DefaultValue = 1000)]
    public int ConnectionTimeout
    {
        get { return (int)this["ConnectionTimeout"]; }
        set { this["ConnectionTimeout"] = value; }
    }
    ... // other values
}

person astrowalker    schedule 17.01.2017    source источник
comment
Пожалуйста, покажите нам код   -  person Jens Meinecke    schedule 17.01.2017
comment
@Übercoder, смотрите обновление.   -  person astrowalker    schedule 17.01.2017


Ответы (2)


Ну, я думаю, если вы не можете использовать сериализатор с классом контракта без данных, возможно, вам следует разделить свойства члена данных на другой класс, который будет агрегирован в вашем ConfigurationSection:

[DataContract]
public sealed class CustomConfig
{
   [DataMember]
    public int ConnectionTimeout {get;set;}
}

public sealed class MyConfig : ConfigurationSection
{
    private CustomConfig _customCfg = new  CustomConfig(){ConnectionTimeout = this.ConnectionTimeout};

    [ConfigurationProperty("ConnectionTimeout", DefaultValue = 1000)]
    public int ConnectionTimeout
    {
        get { return (int)this["ConnectionTimeout"]; }
        set { _customCfg.ConnectionTimeout = value;this["ConnectionTimeout"] = value; }
    }
    ... // other values
}

Чем вы можете сериализовать экземпляр CustomConfig с помощью вашего сериализатора

person VitaliyK    schedule 17.01.2017
comment
Пока я использую что-то похожее, я создаю тип-обертку, который имеет точно такие же значения, при создании эта оболочка копирует все значения из типа config. Тем не менее, это детали реализации, один хрупкий момент заключается в том, что вы однажды забываете о копировании, и у вас будет значение по умолчанию в целевом типе. Поэтому я ищу что-то более автоматическое. - person astrowalker; 17.01.2017
comment
Может быть, чем использовать отражение для копирования свойств? Затем, если вы добавите новые свойства, они будут скопированы автоматически. - person VitaliyK; 17.01.2017
comment
Спасибо, хорошая идея. Я немного подожду, если я ничего не найду, я пойду по этому пути (и приму ваш ответ), хорошо? - person astrowalker; 17.01.2017

Есть и другой способ — вместо того, чтобы полагаться на автоматическую сериализацию, напишите собственную сериализацию вручную. Поскольку NetDataContractSerializer поддерживает его, вы можете получить только один тип с двумя дополнительными методами (точнее: дополнительный метод для сериализации и конструктор для десериализации).

Например, см. сообщение: , когда используя ISerializable с DataContractSerializer, как мне запретить сериализатору выводить информацию о типе?

person astrowalker    schedule 23.01.2017