2012-03-13 86 views
0

長話短說,我的應用程序一直使用二進制化來在服務器/客戶端之間發送原始文本和圖形。想要在相同的端口上推送這兩個項目,我試着改變爲使用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

你的一切包括* _ *除外_反序列化的樣本消息...... – 2012-03-13 01:34:44

+0

有沒有辦法找到,而信息在VS2010中進行調試還是應該編寫一個單獨的實例來將其序列化爲文件?在測試中,字符串僅僅是「這是一個成功的文本傳輸」,然後用「TMain」標誌打包。 – ChargerIIC 2012-03-13 01:58:33

+1

提琴手是你的朋友。 – 2012-03-13 01:59:31

回答

1

解決的問題。我莫名其妙地離開了行:

BinaryFormatter formatter = new BinaryFormatter(); 

是其需要:

SoapFormatter formatter = new SoapFormatter();