2013-05-06 65 views
2

這是推動我瘋了,現在,我目前正在寫一些客戶端/服務器軟件,我可以把客戶端之間的陣列沒有問題,但問題就出在這個代碼在這裏:序列化類丟失的數據

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 
lock (fs) 
     lock (sharedVars.clients[i]) 
      formatter.Serialize(fs, sharedVars.clients[i]); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 

我運行代碼和斷點,我可以看到內存流中包含的數據來自序列化,但它永遠不會將它傳送到另一臺計算機(實際上這通過本地主機來避免實際的網絡硬件錯誤)。

這是使用TCP和真正的瘋狂的部分是,如果我手動寫入一個新的字節數組到存儲流數據到另一側沒有問題,本質上它只是不喜歡序列化的數據。現在我真的很困惑,所以我向社區提出問題,有什麼想法?

更多參考這就是被調用時完全空數組(巴在開始request_rtn字節)到達另一端:

Shared.SharedValues.Client clientTemp; 

readBuffer = removeFirstByte(readBuffer); 

BinaryFormatter formatter = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(readBuffer); 

ms.Position = 0; 

lock (serverValues) 
    clientTemp = (Shared.SharedValues.Client)formatter.Deserialize(ms); 

serverValues.clients[clientTemp.ID] = clientTemp; 

再換在服務器端,我改變的代碼測試它,它在各方面的工作:

MemoryStream fs = new MemoryStream(); 
BinaryFormatter formatter = new BinaryFormatter(); 

byte[] byteArray = new byte[10000]; 

for (i = 0; i < 10000; i++) 
{ 
    byteArray[i] = (byte)i; 
} 

lock (fs) 
    lock (sharedVars.clients[i]) 
     //formatter.Serialize(fs, sharedVars.clients[i]); 
     fs.Write(byteArray, 0, 10000); 
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray())); 
+0

你檢查了fs.toArray()的內容嗎? – 2013-05-06 21:02:23

+0

在這兩種情況下,它們都包含我所期望的。 – 2013-05-06 21:05:28

+0

客戶端和服務器都使用'Shared.SharedValues.Client'的相同類定義嗎? – rsbarro 2013-05-06 21:05:59

回答

1

多玩弄圍繞我結束了簡單地使用緩衝區寫入到自身解決問題後:

fs.Write(fs.GetBuffer(), 0, fs.Capacity); 

我覺得必須有一個編譯器錯誤或者正在發生的事情,然而這說服了它的行爲。現在我將轉向現在出現的其他問題。

廢品很多,事實證明,上面的行沒有任何幫助,真正的錯誤是,我正在做一個異步寫入,幾乎立即正在寫入網絡的緩衝區被破壞,這實質上意味着1或2個字節通過,然後加載0。所以對於將來遇到這個問題的任何人,確保你沒有像我這樣愚蠢。

非常感謝你們的一些人爲了弄清楚發生了什麼。