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文件中写入是被禁止的,应该避免吗?

Combining XmlSerializer and XmlWriter?

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 文件 - 你需要在编写序列化对象之前写出一个初始元素标签,然后在写出自定义元素后关闭该标签 - 在你使用的代码模式中,你需要手动编写这个标签并关闭标签