2016-03-03 2 views
0

У меня есть (много сокращенный) класс вроде этого:.NET XmlSerializer: Сериализация когда свойство сеттер имеет дополнительный код

public class Widget 
{ 
    public List<Widget> SubWidgets { get; set; } 
    public Widget ParentWidget { get; set; } 

    private double _ImportantValue; 
    public double ImportantValue 
    { 
    get { return _ImportantValue; } 
    set 
    { 
     _ImportantValue = value; 
     RecalculateSubWidgets(); 
    } 
    } 
} 

Когда десериализаций, я не хочу, чтобы RecalculateSubWidgets. Каков наилучший способ справиться с этой ситуацией? Единственное, что мне удалось придумать, - это установить «глобальную» переменную, в которой говорится, что я десериализую и пропустил вызов RecalculateSubWidgets() в этом случае, но это кажется ультра-kludgy.

+0

Вы можете использовать пользовательскую сериализацию, реализуя ISerializable: https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable(v=vs.110).aspx – Kevin

ответ

0

Простой способ может быть игнорировать текущее свойство и использовать другую для получения десериализованного значения:

private double _ImportantValue; 

[XmlElement("ImportantValue")] 
public double ImportantValueFromXml 
{ 
    get { return _ImportantValue; } 
    set 
    { 
     _ImportantValue = value; 
    } 
} 

[XmlIgnore] 
public double ImportantValue 
{ 
    get { return _ImportantValue; } 
    set 
    { 
     _ImportantValue = value; 
     RecalculateSubWidgets(); 
    } 
} 

Когда вы десериализовать RecalculateSubWidgets() метод не будет вызван, но ваше личное поле будет по-прежнему имеют значение. Конечно, вы можете немного изменить свой дизайн и избавиться от вызова функции в сеттере, чтобы избежать этой ситуации, но это может быть краткосрочное решение.

+0

Это кажется разумным. Спасибо! – user3215491

Смежные вопросы