2012-03-13 22 views
0

私のアプリケーションはバイナリのserilizationを使用してサーバー/クライアント間で生テキストとグラフィックを送信していました。同じポート上で両方の項目をプッシュしたいと思ったが、型のフラグを持つオブジェクトを送信するためにSoapフォーマッタを使用し、後でキャストするオブジェクトを含むように変更を試みた。私はabjectの文字列をラップし、SoapFormatterを使用してオブジェクトを直列化および逆シリアル化します。私が試してみると、クライアントはオブジェクトを逆シリアル化している間に例外をスローします: "指定されたエンコーディングの文字が無効です.1行目、6行目"私が間違っていることを知っていますか?SoapFormatterを使用したときの無効なXML応答

ネットワークを介して送信されるオブジェクト:

[Serializable] 
public class NetContainer 
{ 

    //this object is sent and can contain either Text or an Image file 
    #region Variables 

    private Flag flag; //type of object being sent 
    private object media; 

    #endregion Variables 

    #region Constructor 

    public NetContainer(Flag type, object containedObject) 
    { 
     flag = type; 
     media = containedObject; 
    } 

    #endregion Constructor 

    #region Properties 

    public Flag Flag 
    { 
     get { return flag; } 
     set { flag = value; } 
    } 

    public object Media 
    { 
     get { return media; } 
     set { media = value; } 
    } 

    #endregion Properties 

} 
    public enum Flag 
    { 
     Imain, 
     IProfile, 
     TMain, 
     ABack 
    } 

送信コード:

public void SendText(string text) 
    { 

     //assemble package 
     NetContainer package = new NetContainer(Flag.TMain, text); 

     foreach (TcpClient clientInstance in ClientList) 
     { 
      if (clientInstance.Connected) //if connection is active 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       //serialize package and send 
       formatter.Serialize(clientInstance.GetStream(), package); 
      } 
     } 
    } 

例外をスロー受信コード:

private void StartReading() 
    { 
     while (connection.Connected == true) 
     //while (true) 
     { 
      using (NetworkStream stream = connection.GetStream()) //use the client's connection stream 
      { 
       //BinaryFormatter formatter = new BinaryFormatter(); 
       SoapFormatter formatter = new SoapFormatter(); 
       while (true) 
       { 
        //deserialize the package from the network stream 
        NetContainer package = (NetContainer)formatter.Deserialize(stream); 

        switch (package.Flag) 
        { 
         case Flag.TMain: 
          rtbMain.Text += (string)package.Media; 
          break; 
         case Flag.Imain: 
          pbxMain.Image = (Image)package.Media; 
          break; 
         default: 
          Console.WriteLine("Unkown Flag error: " + package.Flag); 
          break; 

        } 
       } 
      } 
     } 
    } 
+0

を... –

+0

は、その情報の中を検索する方法はありますVS2010でデバッグするか、ファイルにシリアル化するために別のインスタンスを作成する必要がありますか?テストでは、文字列は単に "これは成功したテキスト伝送"で、次にフラグ 'TMain'でパッケージ化されました。 – ChargerIIC

+1

Fiddlerはあなたの友人です。 –

答えて

1

問題は解決。

BinaryFormatter formatter = new BinaryFormatter(); 

にする必要:私は何とかライン左あなたが直列化復元される* _サンプルメッセージ以外のすべて_ *を含ま

SoapFormatter formatter = new SoapFormatter(); 
関連する問題