2009-06-09 16 views
15

XMLの一部を作成しようとしています。私はxsd.exeでデータスクラップを作成しました。 ルートクラスはMESSAGEです。XmlTextWriterのシリアル化の問題

のでMESSAGEを作成し、そのすべてのプロパティを充填した後、私はこのようにそれをシリアル化:これまでは

serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
StringWriter sw = new StringWriter(); 
serializer.Serialize(sw, response); 
string xml = sw.ToString(); 

すべてがうまくいく、文字列のXMLが有効(UTF-16でエンコード)は、XMLが含まれています。 は今、私の代わりにUTF-8エンコーディングでXMLを作成したいので、私はこのようにそれを実行します。

編集:ストリームの宣言を含めるのを忘れて

serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8); 
    serializer.Serialize(xtw, response); 
    string xml = Encoding.UTF8.GetString(stream.ToArray()); 
} 

そしてここでは、問題が来ます:この方法を使用すると、xml文字列の前に無効なchar(悪名高い正方形)が追加されます。
私はこのような文字を検査する場合:

char c = xml[0]; 

を私はCが65279
誰の価値を持って見ることができるが、これはから来ているの手掛かりを持っていますか?
私は簡単に最初の文字を遮断することでこの問題を解決することができます

xml = xml.SubString(1); 

しかし、私はむしろ盲目的に最初の文字の切断よりも、何が起こっているのかを知っていると思います。

誰もがこれにいくつかの光を当てることができますか?ありがとう!

+0

を参照してください:http://stackoverflow.com/questions/955611/xmlwriter-to-write-to-a -string-to-a-file/955698#955698 –

答えて

15

はバイトオーダーマーク(BOM)を先頭に付加しないように変更され、あなたのコードです:

var serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false); 
XmlTextWriter xtw = new XmlTextWriter(stream, utf8EncodingWithNoByteOrderMark); 
serializer.Serialize(xtw, response); 
string xml = Encoding.UTF8.GetString(stream.ToArray()); 
+0

私はこの解決法を使っていたので、私はこの答えを受け入れました。ありがとう! – fretje

6

65279はUnicodeのバイトオーダーマークです - あなたは65249を取得していますか?実際にがBOMのであると仮定すると、BOMを使用しないUTF8Encodingインスタンスを作成することでそれを取り除くことができます。 (詳細については、コンストラクタのオーバーロードを参照してください)。

しかし、UTF-8を取得する方法は簡単です。 StringWriterを使用できますが、Encodingプロパティをオーバーライドする派生クラスです。例については、this answerを参照してください。ここで

+0

コードを実行して65279を得ました。おそらく、質問のタイプミス。 –

+0

本当にタイプミス...更新;-) – fretje

+0

BOM:http://en.wikipedia.org/wiki/Byte-order_markを参照 –