我有一个C#类,想要使用XMLSerializer进行序列化。但我希望它序列化为一个XMLElement或XMLDocument。这是否可能?还是必须将其序列化为字符串,然后解析该字符串以获得XMLDocument?
我也遇到过这个问题,Matt Davis提供了一个很好的解决方案。在这里分享一些代码片段,因为还有一些细节需要注意。
public static XmlElement SerializeToXmlElement(object o)
{
XmlDocument doc = new XmlDocument();
using(XmlWriter writer = doc.CreateNavigator().AppendChild())
{
new XmlSerializer(o.GetType()).Serialize(writer, o);
}
return doc.DocumentElement;
}
public static T DeserializeFromXmlElement<T>(XmlElement element)
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(new XmlNodeReader(element));
}
Public Shared Function ConvertClassToXml(source As Object) As XmlDocument
Dim doc As New XmlDocument()
Dim xmlS As New XmlSerializer(source.GetType)
Dim stringW As New StringWriter
xmlS.Serialize(stringW, source)
doc.InnerXml = stringW.ToString
Return doc
End Function
Public Shared Function ConvertClassToXmlString(source As Object) As String
Dim doc As New XmlDocument()
Dim xmlS As New XmlSerializer(source.GetType)
Dim stringW As New StringWriter
xmlS.Serialize(stringW, source)
Return stringW.ToString
End Function
Public Shared Function ConvertXmlStringtoClass(Of T)(source As String) As T
Dim xmlS As New XmlSerializer(GetType(T))
Dim stringR As New StringReader(source)
Return CType(xmlS.Deserialize(stringR), T)
End Function
Public Shared Function ConvertXmlToClass(Of T)(doc As XmlDocument) As T
Dim serializer = New XmlSerializer(GetType(T))
Return DirectCast(serializer.Deserialize(doc.CreateNavigator.ReadSubtree), T)
End Function