2011-01-20 13 views
1

私はC#ソケットを使用しており、XMLSerializerを使用してデータを送受信しています。 XMLデータは、TCP/IPプロトコルを使用してネットワーク接続を介してサーバーからクライアントに送信されます。 XML.Serializer.Serialize(stream)は、XMLデータをシリアル化し、ソケット接続を介して送信しますが、XMLSerializer.Deserialize(stream)を使用して読み取りたい場合に使用します。送信されたデータは、xml解析エラーを返します。ここでXMLSerializerを使用してシリアライズおよびデシリアライズする際の問題

は私がシリアライズてる方法です:

Memory Stream ms = new MemoryStream(); 
FrameClass frame= new FrameClass(); 
frame.string1 = "hello"; 
frame.string2 = "world"; 

XmlSerializer xmlSerializer = new XmlSerializer(frame.GetType()); 
xmlSerializer.Serialize(ms, frame); 

socket.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); 

デシリアライズ:

FrameClass frame; 
XmlSerializer xml = new XmlSerializer(typeof(FrameClass)); 
frame= (FrameClass)xml.Deserialize(new MemoryStream(sockCom.SocketBuffer)); 
listbox1.Items.Add(frame.string1); 
listbox2.Items.Add(frame.string2); 

私はそれが右の別の後にデータ1を送信することとは何かを持っていると思います。 誰でも私にこのことを正しく行う方法を教えてもらえますか?

+0

テキストエディットボックスでコードサンプルフォーマッタを使用します。コードをハイライト表示し、エディタツールバーの "{}"オプションをクリックします。 – Wesley

答えて

0

デシリアライズを試みる前にすべてのデータを受け取ったことがありますか(コードからはわかりません)。私はすべてのデータをローカルの文字列に受け取り、ソケットから直接逆シリアル化しようとするのではなく、それを逆シリアル化する傾向があります。デシリアライズする前に、実際にデバッガ内のデータを見ることもできます。

+0

何が起こっているのは、ソケットバッファ内で受信したすべてのオブジェクトをスタックしているため、そのソケットバッファをオブジェクト(この場合はフレームクラス)に変換しようとしているときにエラーが発生したためですバッファに複数のフレームクラスオブジェクトがあることを確認します。 – Jeff

+0

はい、すべてのフレームを取り出し、それらを1つの文字列に入れ、それから逆シリアル化します。 – ctacke

+0

私が間違っている場合は、私はそれをフレームクラスオブジェクトにキャストする代わりに、それを文字列にキャストすると言っているのですか?文字列形式のXMLをフレームクラスオブジェクトに処理しますか? – Jeff

0

これを試してみてください:

using (MemoryStream ms = new MemoryStream()) 
{ 
    FrameClass frame= new FrameClass(); 
    frame.string1 = "hello"; 
    frame.string2 = "world"; 

    XmlSerializer xmlSerializer = new XmlSerializer(frame.GetType()); 
    xmlSerializer.Serialize(ms, frame); 
    ms.Flush(); 
    socket.Send(ms.GetBuffer(), (int)ms.Length, SocketFlags.None); 
} 

あなたが他の後のフレームXMLを一人の権利を送信する場合、あなたは、XML文書を送信していません。 XMLシリアライザはドキュメント全体をデシリアライズしようとします!

私は今これを調べる時間がありませんが、XMLフラグメントを読み取るためのXmlReaderSettingsプロパティを調べます。これらの設定を使用してmemorystreamにXmlReaderを作成し、ループで呼び出します。

重要なことは、ストリームをフラッシュすることです。また、ストリームをusingブロックに入れると、ストリームをすばやく整理することができます。

+0

それは仕事をしなかった、それは私にXMLExceptionを与えた。予期しないXML宣言。 XML宣言は文書内の最初のノードでなければならず、その前に空白文字は表示できません。 9行目、18行目。フレームクラスを直後に送信していることに注意してください。良い例は、上のコードをwhileループで使用することです。 – Jeff

0

@HohnがFlush呼び出しについて述べたこと以外に、コードは問題なく表示されます。

複数のFrameClassデータを送信しているとしたら、コードは1つのデータだけを送信する必要があります。

複数のデータオブジェクトを送信する必要がある場合は、それらをすべて一度に送信することはできません。そうしないと、デシリアライズ処理がデータに掛かります。 サーバ&とクライアントとの間の通信をセットアップして、サーバが何を得ているかを知ることができます。

クライアント:私はいくつかのデータを持っている

サーバー:OK、私は準備ができています、それを

クライアントを送信します。

...行わ

リピートプロセスを処理:

サーバーを送信

関連する問題