2009-11-15 56 views
8

在嘗試回答另一個問題時,我將C#對象序列化爲XML字符串。令人驚訝的是,這是最短的代碼片段我能想出:更簡單的方式將C#類序列化爲XML文本

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()); 

結果是好的:

<?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> 

但片段是比我想應該是更加複雜。我不相信你必須知道編碼和MemoryStream這個簡單的任務。

是否有更簡單的方法將對象序列化爲XML字符串?

回答

19

短一點:-)

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(); 
} 

儘管有此之前的做法,值得指出的一個缺陷。它將生成一個utf-16標題,因爲我們使用StringWriter,因此它不完全等同於您的代碼。爲了得到utf-8頭,我們應該使用MemoryStreamXmlWriter這是額外的代碼行:

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()); 
    } 
} 
+1

如果你不做'GetStringBuilder()' – 2009-11-15 21:04:33

+1

更短,謝謝,SQL Server只接受UTF-8版本。我猜這就像在C#中一樣簡單... – Andomar 2009-11-16 12:00:08

+2

@Andomar:我之前沒有看到過這個問題......你可以使用我的Utf8StringWriter類來避免這些代碼。請參閱http://stackoverflow.com/questions/3862063 – 2010-10-05 08:49:59

0

編寫一個擴展方法或封裝類/函數來封裝代碼片段。

+4

不特別是使它更簡單 - 只是重新定位複雜性(儘管它意味着重用水平)。 – Murph 2009-11-15 19:31:49

0

你不需要MemoryStream,只需使用一個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(); 
} 
+3

這將是UTF-16,而不是UTF-8 – 2010-10-05 08:48:24