Сериализация XmlDocument завершается ошибкой, когда XmlSerializer создается с помощью XmlRootAttribute - PullRequest
1 голос
/ 23 апреля 2020

Я сталкиваюсь с проблемой при сериализации XmlDocument, когда XmlSerializer создается с помощью XmlRootAttribute. Это образец, который я подготовил для воспроизведения проблемы.

class Program
    {
        static void Main(string[] args)
        {
            SerializeDataSet("a1.xml");
        }

        private static void SerializeDataSet(string filename)
        {
            XmlDocument testProperties = new XmlDocument();
            XmlSerializer ser = new XmlSerializer(typeof(XmlDocument), null, new Type[0], new XmlRootAttribute("dummy"), "testns");

            // Creates a DataSet; adds a table, column, and ten rows.
            DataSet ds = new DataSet("mydatads");
            DataTable t = new DataTable("mytable1");
            DataColumn c = new DataColumn("mycolumn");
            t.Columns.Add(c);
            ds.Tables.Add(t);
            DataRow r;
            for (int i = 0; i < 10; i++)
            {
                r = t.NewRow();
                r[0] = "row " + i;
                t.Rows.Add(r);
            }
            testProperties.LoadXml(ds.GetXml());
            TextWriter writer = new StreamWriter(filename);
            ser.Serialize(writer, testProperties);
            writer.Close();
        }
    }

Это ошибка со следующим исключением.

 Unhandled exception. System.InvalidOperationException: There was an error generating the XML document.
 ---> System.InvalidOperationException: This element was named 'mydatads' from namespace '' but should have been named 'dummy' from namespace ''.
   at System.Xml.Serialization.XmlSerializationWriter.WriteElement(XmlNode node, String name, String ns, Boolean isNullable, Boolean any)
   at System.Xml.Serialization.XmlSerializationWriter.WriteElementLiteral(XmlNode node, String name, String ns, Boolean isNullable, Boolean any)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterXmlDocument.Write1_dummy(Object o)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
   at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
   at Program.SerializeDataSet(String filename) in Program.cs:line 49
   at Program.Main(String[] args) in Program.cs:line 26

Когда я создаю экземпляр XmlSerializer как new XmlSerializer(typeof(XmlDocument)); тогда это работает, но тогда оно пропускает элемент root. Кроме этого, я не могу это контролировать. Я могу изменить XmlDocument, но не могу изменить XmlSerializer. Я не уверен, что происходит, когда XmlRootAttribute присутствует.

...