2011-08-09 9 views
0

私はヘルパーメソッドを使用してオブジェクトをシリアライズします。このメソッドは、エンコーディングを変更しようとするまで動作します。コンシューマーWebサービスが受け取ったときに、いくつかの奇妙な文字で間違っているようです。期待どおりXML(UTF-8)にシリアル化されていないオブジェクト.net?

ここでアプリからのログエントリが

UTF-16(これは動作します)、次のとおりです。私は

2011-08-09 11:21:30,687 DEBUG SomeRestfulService * xmlData <?xml version="1.0" encoding="utf-8"?><loginRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><UserName>Admin</UserName><Password>Password</Password><MarketCode>GB</MarketCode></loginRequest> 

2011-08-09 11:16:03,140 DEBUG SomeRestfulService * xmlData <?xml version="1.0" encoding="utf-8"?> 
<loginRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UserName>Admin</UserName> 
    <Password>Password</Password> 
    <MarketCode>GB</MarketCode> 
</loginRequest> 

UTF-8(変な文字に注意してください)それがなぜレイアウトを失ったのかわからない。

ヘルパーメソッド:

Public Shared Function SerializeObject(ByVal obj As Object, ByVal encoding As Text.Encoding) As String 

    Dim serializer As New XmlSerializer(obj.GetType) 

    If encoding Is Nothing Then 
     Using strWriter As New IO.StringWriter() 
      serializer.Serialize(strWriter, obj) 
      Return strWriter.ToString 
     End Using 
    Else 
     Using stream As New IO.MemoryStream, xtWriter As New Xml.XmlTextWriter(stream, encoding) 
      serializer.Serialize(xtWriter, obj) 
      Return encoding.GetString(stream.ToArray()) 
     End Using 
    End If 


End Function 

注:私は何としてエンコーディングを渡した場合は、デフォルトのエンコーディングはUTF-16である、すべてはもともと私は符号化部がなかった、okですが、それは必要条件であるので、そこにいる必要があります。

UTF-8にエンコードするときにシリアライズを間違って実行していますか?これをどうすれば解決できますか?

私はBOMを省略し、以下を試してみましたが、それでも同じ問題います

Dim utf8 As New Text.UTF8Encoding(True) 
Using stream As New IO.MemoryStream, xtWriter As New Xml.XmlTextWriter(stream, utf8) 
    serializer.Serialize(xtWriter, obj) 
    Return utf8.GetString(stream.ToArray()) 
End Using 
+0

あなたのutf16バージョンも悪いです。 BOMが見えないので、それを見ることはできません。 –

+0

@ハンス、UTF-16が動作します。 –

答えて

1

あなたが見ている何が、多くの場合、テキストファイルやストリームの開始時に使用されているbyte order mark(BOM)でありますバイトオーダーとUnicodeバリアントを示す。

シリアライザは非常に奇妙です。 UTF-8などのエンコーディングで文字列をエンコードする場合は、バイト配列として返す必要があります。最初にXMLをUTF-8でエンコードし、その後UTF-8ストリームを文字列にデコードすることで、問題のあるBOMを導入することを除いては何も得られません。

UTF-16のみを使用するか、バイト配列を返します。関数が今であるので、エンコーディングは問題を導入するだけです。

更新:

アプローチ1:直列化されたデータの文字列を作成し、UTF-8に変換し

以下のコメント内のコードに基づいて、私は2つのアプローチが表示されます遅い

Public Shared Function SerializeObject(ByVal obj As Object) As String 

    Dim serializer As New XmlSerializer(obj.GetType) 

    Using strWriter As New IO.StringWriter() 
     serializer.Serialize(strWriter, obj) 
     Return strWriter.ToString 
    End Using 

End Function 

.... 

Dim serialisedObject As String = SerializeObject(object) 
Dim postData As Byte() = New Text.UTF8Encoding(True).GetBytes(serialisedObject) 

異なるエンコードが必要な場合は、最後の行を変更します。バイトオーダーマークを省略する場合は、FalseUTF8Encoding()に渡します。

アプローチ2:最初の場所に適切にエンコードされたデータを作成し、この場合

Public Shared Function SerializeObject(ByVal obj As Object, ByVal encoding As Text.Encoding) As Byte() 

    Dim serializer As New XmlSerializer(obj.GetType) 

    If encoding Is Nothing Then 
     Set encoding = Encoding.Unicode 
    End If 

    Using stream As New IO.MemoryStream, xtWriter As New Xml.XmlTextWriter(stream, encoding) 
     serializer.Serialize(xtWriter, obj) 
     Return stream.ToArray() 
    End Using 

End Function 


.... 

Dim postData As Byte() = SerializeObject(object) 

バイト配列に進み、XmlTextWriter直接正しい符号を用いてデータを符号化します。既にバイト配列があるので、最後のステップは短くなります。クライアントに直接送信するデータがあります。

+0

私はUTF-8を使用する必要があります。あなたはサンプルコードを与えることができますか?私はここからこのコードを取得しました:http://ashish.tonse.com/2008/04/serializing-xml-in-net-utf-8-and-utf-16/ –

+0

メソッドは文字列を返す必要があります。 –

+1

UTF-8の使い方を助けるために、より多くのコード、つまりシリアル化されたデータをコンシューマWebアプリケーションに渡す方法について説明します。しかし、一般的なアプローチは、UTF-8でデータをシリアライズした後、バイト配列で処理し、文字列に戻すことはありません。 – Codo

関連する問題