XmlSerializer : Encoding & Xml Namespaces

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 的標籤: