2016-07-03 5 views
2

У меня возникла проблема с внедрением механизма IsDirty с моей системой XmlSerializer.Все мои флаги IsDirty установлены в true после чтения в XML-файле с использованием XmlSerializer

Это как называется моя сериализации:

public OCLMEditorModel() 
{ 
    DeSerialize(); 
} 

public void Serialize() 
{ 
    XmlSerializer x = new XmlSerializer(_ModelData.GetType()); 
    using (StreamWriter writer = new StreamWriter(_strPathModelDataXml)) 
    { 
     x.Serialize(writer, _ModelData); 
    } 
} 

public void DeSerialize() 
{ 
    _ModelData = new OCLMModelData(); 
    XmlSerializer x = new XmlSerializer(_ModelData.GetType()); 
    using (StreamReader reader = new StreamReader(_strPathModelDataXml)) 
    { 
     _ModelData = (OCLMModelData)x.Deserialize(reader); 
    } 
} 

Он читает и сохраняет отлично, никаких проблем нет. Но это флаг IsDirty, с которым у меня проблемы. Непосредственно после вызова десериализации ...

Set to true

попки IsDirty значение истина. Хотя все, что мы сделали, читается с компьютера. Свойства примера:

public class MaterialItem 
{ 
    [XmlAttribute] 
    public string Setting 
    { 
     get { return _Setting; } 
     set 
     { 
      _Setting = value; 
      MarkDirty(); 
     } 
    } 
    private string _Setting; 

    [XmlText] 
    public string Material 
    { 
     get { return _Material; } 
     set 
     { 
      _Material = value; 
      MarkDirty(); 
     } 
    } 
    private string _Material; 

    [XmlIgnore] 
    public bool IsDirty { get { return _isDirty; } } 
    private bool _isDirty; 

    public void MarkClean() 
    { 
     _isDirty = false; 
    } 

    protected void MarkDirty() 
    { 
     _isDirty = true; 
    } 

    public MaterialItem() 
    { 
     MarkClean(); 
    } 
} 

В идеале флаг должен быть ложным, когда мы только что прочитали его, используя XMLSerializer.

Что я делаю неправильно?

спасибо.

+2

Когда объект в настоящее время десериализации, он устанавливает вызывается значение свойства и в устройстве свойств, 'MarkDirty()', которое отмечает все как грязное. –

+0

шаг за кодом и посмотреть, что он делает или не делает то, что вы ожидаете – MethodMan

ответ

3

XmlSerializer не работает ни в каком таинственном виде.

Используется отражение, да, но только до get the properties it can serialize/deserialize. Затем он использует эти свойства для получения/установки требуемых значений.

Таким образом, во время десериализации эти сеттеры будут вызваны, тем самым называя метод MarkDirty, тем самым загрязняя ваши объекты.

Существует не все, что вы можете изменить в XmlSerializer, но вы можете изменить метод десериализации, поэтому он устанавливает объект в чистоте только после десериализации его:

public void DeSerialize() 
{ 
    _ModelData = new OCLMModelData(); 
    XmlSerializer x = new XmlSerializer(_ModelData.GetType()); 
    using (StreamReader reader = new StreamReader(_strPathModelDataXml)) 
    { 
     _ModelData = (OCLMModelData)x.Deserialize(reader); 
    } 
    _ModelData.MarkClean(); 
} 
+0

@AndrewTruckle Нет ничего плохого в добавлении дополнительной информации в эту тему, но обычно [нахмурился, когда сама тема сильно изменилась) (http: //meta.stackoverflow.com/questions/300966/dealing-with-solutions-that-end-with-a-new-error) - в таком случае лучше задать новый вопрос, связав его с текущим чтобы дать необходимый контекст. –

+1

Это не новый вопрос ... :) Просто обновил его. Посмотрите внизу. –

+0

Спасибо. Я буду придерживаться только метода MarkClean, который анализирует прочитанные данные. Спасибо. :) –