Easier way to serialize C# class as XML text
While trying to answer another question, I was serializing a C# object to an XML string. It was surprisingly hard; this was the shortest code 开发者_JS百科snippet I could come up with:
var yourList = new List<int>() { 1, 2, 3 };
var ms = new MemoryStream();
var xtw = new XmlTextWriter(ms, Encoding.UTF8);
var xs = new XmlSerializer(yourList.GetType());
xs.Serialize(xtw, yourList);
var encoding = new UTF8Encoding();
string xmlEncodedList = encoding.GetString(ms.GetBuffer());
The result is okay:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfInt
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<int>1</int>
<int>2</int>
<int>3</int>
</ArrayOfInt>
But the snippet is more complicated than I think it should be. I can't believe you have to know about encoding and MemoryStream for this simple task.
Is there a shorter way to serialize an object to an XML string?
A little shorter :-)
var yourList = new List<int>() { 1, 2, 3 };
using (var writer = new StringWriter())
{
new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
var xmlEncodedList = writer.GetStringBuilder().ToString();
}
Although there's a flaw with this previous approach that's worth pointing out. It will generate an utf-16
header as we use StringWriter so it is not exactly equivalent to your code. To get utf-8
header we should use a MemoryStream and an XmlWriter which is an additional line of code:
var yourList = new List<int>() { 1, 2, 3 };
using (var stream = new MemoryStream())
{
using (var writer = XmlWriter.Create(stream))
{
new XmlSerializer(yourList.GetType()).Serialize(writer, yourList);
var xmlEncodedList = Encoding.UTF8.GetString(stream.ToArray());
}
}
Simply if you want to use UTF8 encoding then do it like this
public class StringWriterUtf8 : System.IO.StringWriter
{
public override Encoding Encoding
{
get
{
return Encoding.UTF8;
}
}
}
and then use StringWriterUtf8 insread of StringWriter like this
using (StringWriterUtf8 textWriter = new StringWriterUtf8())
{
serializer.Serialize(textWriter, tr, ns);
xmlText = textWriter.ToString();
}
Write an extension method or a wrapper class/function to encapsulate the snippet.
You don't need the MemoryStream
, just use a StringWriter
:
var yourList = new List<int>() { 1, 2, 3 };
using (StringWriter sw = new StringWriter())
{
var xs = new XmlSerializer(yourList.GetType());
xs.Serialize(sw, yourList);
string xmlEncodedList = sw.ToString();
}
精彩评论