Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用XmlSerializer读取XML文件后,所有my IsDirty标志都设置为true_C#_Xml_Wpf_Xmlserializer - Fatal编程技术网

C# 在使用XmlSerializer读取XML文件后,所有my IsDirty标志都设置为true

C# 在使用XmlSerializer读取XML文件后,所有my IsDirty标志都设置为true,c#,xml,wpf,xmlserializer,C#,Xml,Wpf,Xmlserializer,我在用XmlSerializer系统实现IsDirty机制时遇到问题 以下是我的序列化的调用方式: public OCLMEditorModel() { DeSerialize(); } public void Serialize() { XmlSerializer x = new XmlSerializer(_ModelData.GetType()); using (StreamWriter writer = new StreamWriter(_strPathMode

我在用
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设置为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
以任何神秘的方式工作

它使用反射,是的,但仅用于。然后它使用这些属性来获取/设置所需的值

因此,在反序列化过程中,将调用这些setter,从而调用
MarkDirty
方法,从而将实体标记为dirty

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

当对象被反序列化时,它将在属性上设置值,并在属性设置器中调用
MarkDirty()
,将所有内容标记为dirty。单步遍历代码,查看它正在执行或未执行的操作expect@AndrewTruckle在主题中添加额外信息绝对没有错,但通常情况下——在这种情况下,最好提出一个新问题,同时链接到当前问题以提供必要的上下文。这不是一个新问题……:)刚刚更新过。请看下面。谢谢。我将坚持只制作一个MarkClean方法来解析读入的数据。谢谢。:)@AndrewTruckle好吧,我并不完全同意这不是一个新问题——最初的问题是关于为什么会发生这种情况,而现在更多的是关于有哪些替代方案。我更愿意问一个新问题,即“在对象层次结构的顶部管理一个isdirty标志”——这将更加简洁,并且可能对回答者非常有趣。如果您愿意,我们可以删除这些注释。我把它拿走了。:)