代码之家  ›  专栏  ›  技术社区  ›  Andrew Truckle

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

  •  2
  • Andrew Truckle  · 技术社区  · 8 年前

    我在实施 IsDirty 我的机制 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);
        }
    }
    

    旗帜我有问题。直接在DeSerialize调用之后。。。

    Set to true

    Ass the 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。

    我做错了什么?

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Community Fabien Hure    7 年前

    XmlSerializer 不会以任何神秘的方式工作。

    它使用反射,是的,但仅用于 get the properties it can serialize/deserialize

    因此,在反序列化期间,将调用这些setter,从而调用 MarkDirty 方法,从而将实体标记为脏的。

    没有什么可以改变的 XmlSerializer(Xml序列化程序) ,但您可以更改反序列化方法,因此它会在反序列化实体后立即将其设置为干净:

    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();
    }