序列化为XML文档而不覆盖以前的数据

时间:2013-05-15 14:34:31

标签: c# asp.net xml serialization

我需要序列化为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(); }
    }

3 个答案:

答案 0 :(得分:2)

The contract for the StreamWriter constructor taking only a filename表示如果指定的文件存在,则会被覆盖。所以这与序列化到XML本身无关。如果您通过其他方式写入流,则会得到相同的结果。

执行所需操作的方法是将旧的XML文件读入内存,进行必要的更改,然后序列化并将结果写入磁盘。

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

当然,如果你可以将你想做的任何改变放到已经在磁盘上的字节中,你就可以做到这一点......

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

答案 1 :(得分: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 );

答案 2 :(得分:0)

试试这个:

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

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

真=追加, false =覆盖

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