我需要序列化为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(); }
}
答案 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 =覆盖