XmlSerializer : Encoding & Xml Namespaces
有時候我們會需要將物件做Xml序列化,但是要怎麼去控制XML的Encoding以及NameSpaces呢?
先來看一下使用TextWriter的結果…
{
TextWriter tw = new StringWriter();
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xs.Serialize(tw, t, xsn);
return tw.ToString();
}
<OrderedItem
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ItemName>Pen</ItemName>
<UnitPrice>2</UnitPrice>
<Quantity>10</Quantity>
<LineTotal>20</LineTotal>
</OrderedItem>
XML的預設編碼會是utf-16,而且TextWriter的Encoding是唯讀屬性無法修改;並且加上提供反序列化xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 以及 xmlns:xsd=http://www.w3.org/2001/XMLSchema 這二個NameSpaces;可是如果今天我想要換成utf-8,而且不想要NameSpaces的時候要怎麼處理呢?
這時候我們可以利用StreamWriter的特性,先宣告Encoding,並且替XmlSerializer加上空的NameSpaces就可以了!
{
MemoryStream ms = new MemoryStream();
//using Encoding
StreamWriter sw = new StreamWriter(ms, Encoding.UTF8);
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
//empty namespaces
xsn.Add(String.Empty, String.Empty);
xs.Serialize(sw, t, xsn);
return Encoding.UTF8.GetString(ms.ToArray());
}
<OrderedItem>
<ItemName>Pen</ItemName>
<UnitPrice>2</UnitPrice>
<Quantity>10</Quantity>
<LineTotal>20</LineTotal>
</OrderedItem>
如何,這樣看起來是不是乾淨很多呢?(其實只是自己龜毛覺得那二個NameSpaces很礙眼而已…XD)
相關連結:
C# 70-536 – Chapter 5 Serialization
DotBlogs 的標籤:C#