0

我需要序列化为 XML 文档而不覆盖当前存在的数据。我有一个方法可以做到这一点,它将保存到 xml 文件中,但会在序列化时删除该文件中当前的任何内容。下面是代码。

public void SaveSubpart()
    {
        SOSDocument doc = new SOSDocument();
        doc.ID = 1;
        doc.Subpart = txtSubpart.Text;
        doc.Title = txtTitle.Text;
        doc.Applicability = txtApplicability.Text;
        doc.Training = txtTraining.Text;
        doc.URL = txtUrl.Text;

        StreamWriter writer = new StreamWriter(Server.MapPath("~/App_Data/Contents.xml"));
        System.Xml.Serialization.XmlSerializer serializer;
        try
        {
            serializer = new System.Xml.Serialization.XmlSerializer(doc.GetType());
            serializer.Serialize(writer, doc);
        }
        catch (Exception ex)
        {
             //e-mail admin - serialization failed
        }
        finally
        { writer.Close(); }
    }
4

3 回答 3

2

StreamWriter仅采用文件名的构造函数的合同规定,如果命名文件存在,则将其覆盖。因此,这与序列化为 XML 本身无关。如果您通过其他方式写入流,您将得到相同的结果。

做您正在寻找的方法是将旧的 XML 文件读入内存,进行任何必要的更改,然后序列化并将结果写入磁盘。

即使可以透明地修改磁盘上的 XML 文件,这几乎肯定会在幕后发生,因为这是真正做到这一点的唯一方法。是的,您可能可以直接在磁盘上查找和写入,但是如果在您这样做时某些东西导致文件在磁盘上发生更改怎么办?如果您执行读/修改/写序列,那么您将丢失在将文件读入内存后所做的更改;但是,如果您通过查找和写入直接在磁盘上修改文件,则几乎可以保证最终文件处于不一致状态。

当然,只有当您可以将想要进行的任何更改放入磁盘上已经存在的字节中时,您才能做到这一点......

如果并发是一个问题,要么使用文件锁定,要么使用具有事务支持的适当数据库。

于 2013-05-15T14:45:40.453 回答
0

因此,您要实现的是序列化对象而不将其覆盖到现有文件中。

因此

XmlSerializer s = new XmlSerializer(doc.GetType());
TextWriter w = new StringWriter();
s.Serialize(w, doc);
var yourXMLstring = w.ToString();

然后,您可以处理此 xml 字符串并将其附加到现有的 xml 文件中(如果需要)。

 XmlDocument xml = new XmlDocument();
 xml.LoadXml(yourXMLstring );
于 2013-05-15T14:52:47.257 回答
0

尝试这个:

StreamWriter writer = new StreamWriter(Server.MapPath("~/App_Data/Contents.xml"),true);

这决定将数据附加到文件中。

真=追加,假=覆盖

更多信息http://msdn.microsoft.com/en-us/library/36b035cb.aspx

于 2013-05-15T15:59:10.087 回答