使用 XmlSerializer 读取 XML 文件后,我所有的 IsDirty 标志都设置为 true

All my IsDirty flags are set to true after reading in a XML file using XmlSerializer

我在使用 XmlSerializer 系统实施 IsDirty 机制时遇到问题。

我的序列化是这样调用的:

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 标志我有问题。在 DeSerialize 调用之后直接...

假设 IsDirty 设置为 true。尽管我们所做的只是从计算机读取它。示例属性:

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 读取它时,该标志应该为 false。

我做错了什么?

谢谢。

XmlSerializer 没有任何神秘的作用。

它使用反射,是的,但仅限于 get the properties it can serialize/deserialize。然后它使用这些属性 get/set 所需的值。

因此在反序列化期间将调用这些设置器,从而调用 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();
}