Я сталкиваюсь с проблемой при сериализации 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
присутствует.