Combining XmlSerializer and XmlWriter?
本文关键字:XmlWriter and XmlSerializer Combining | 更新日期: 2023-09-27 18:36:11
除了我使用 C# 的 XmlSerializer 序列化为 xml 文件的对象列表之外,我还想在同一 xml 中存储更多独立的元素(主要是文本框中的字符串)。
public static void SaveBehaviors(ObservableCollection<Param> listParams)
{
XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType());
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
path += "''test.xml";
using (TextWriter writeFileStream = new StreamWriter(path))
{
_paramsSerializer.Serialize(writeFileStream, listParams);
using (XmlWriter writer = XmlWriter.Create(writeFileStream))
{
writer.WriteStartElement("Foo"); //test entry...
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
}
}
}
但是,反序列化"test.xml"会导致错误,因为添加了元素。我想在序列化的xml文件中写入是被禁止的,应该避免吗?
No.别这样。
如果需要序列化的不仅仅是 ObservableCollection,请定义一个包含类型并序列化它。
public static void SaveBehaviors(ObservableCollection<Param> listParams)
{
XmlSerializer _paramsSerializer = new XmlSerializer(typeof(ContainingType));
var c = new ContainingType(listParams);
c.ExtraInformation = whatever....;
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
path += "''test.xml";
using (TextWriter writeFileStream = new StreamWriter(path))
{
_paramsSerializer.Serialize(writeFileStream, c);
}
}
使用 XmlSerializer。
这是可以做到的,但我强烈建议不要使用流来做到这一点。 通过在编写器中重新打开流(序列化程序将在完成后关闭它),您可以在开始时开始,这就是您获得 MalFormat xml 的原因。
您可以做的是将流重新加载到 XmlDocument 中。 这是一个编辑过的函数,可能更适合您。
public static void SaveBehaviors(ObservableCollection<Param> listParams)
{
XmlSerializer _paramsSerializer = new XmlSerializer(listParams.GetType());
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
path += "''test.xml";
using (TextWriter writeFileStream = new StreamWriter(path))
{
_paramsSerializer.Serialize(writeFileStream, listParams);
using (XmlDocument doc = new XmlDocument())
{
doc.Load(path);//load from the saved document
XmlNode fooNode = doc.CreateElement("foo");//create node
XmlAttribute fooAtt = doc.CreateAttribute("bar");//create attribute
fooAtt.InnerText = "some att data";//set data
fooNode.InnerText = "some node text";//set data
fooNode.Attributes.Append(fooAtt);//add attribute to node
doc.DocumentElement.AppendChild(fooNode);//add node to document
doc.Save(path);//save the changes made
}
}
}
你可以使用XmlWriter,但危险在于确保WriteStream将数据放在正确的位置。 目前,我个人对 XmlWriter 的了解还不够多,无法做到这一点。 这将需要相当多的实验并查看我的输出文件。 使用XmlDocument提供的内置格式要容易得多。
这不是禁止的,你只是在编写一个带有多个根标签的非法 xml 文件 - 你需要在编写序列化对象之前写出一个初始元素标签,然后在写出自定义元素后关闭该标签 - 在你使用的代码模式中,你需要手动编写这个标签并关闭标签