我剛剛從一本java書籍學習網絡,所以我有點小菜鳥。我無法在書中或在網上找到這個問題,所以我決定詢問互聯網。(java)ObjectInputStream反序列化對象的錯誤版本
這本書說使用ObjectOutputStream和ObjectInputStream發送和接收對象到不同的控制檯。
現在,我能夠成功接收我發送的對象 - 但只有一次。當我發送不同的對象:隨機字符串和整數以及無名的實例時,控制檯具有所有正確的字段。但是,當我發送一個對象的實例時,更改其中一個實例字段的值並重新發送該對象,然後inpustream加載原始實例的值。例如,假設我有一個public int「var」等於1的類的實例。如果我發送這個類的實例,客戶端會收到它並正確地報告var = 1。但是, ,如果我將var更改爲2(在同一實例中)並重新發送,則客戶端將完成調用read()方法(因此它必須收到新對象!),但它會將var報告爲1。將實例發送給尚未收到實例的其他客戶端,它會正確地將var報告爲2,即使更改var,它也會繼續將其報告爲2。
客戶端讀取實例的正確版本(如果以前沒有收到它)的事實意味着該對象正在通過輸出流正確發送;由於某些原因輸入流只是不工作。它幾乎就像它看到它是同一個對象,所以它假定它沒有檢查就具有相同的值。爲什麼會發生這種情況,我該如何解決?
對不起,如果我問一些愚蠢的東西 - 本書沒有解釋序列化和套接字是如何工作的,只是如何使用它們,所以我很可能從根本上對如何使用它們感到困惑。謝謝!
簡單的代碼,我寫來測試問題:
服務器:(有計時器的動作來保持發送更新的對象)
public void actionPerformed(ActionEvent e)
{
object.var++;
output.write(object);
output.flush();
System.out.println(object.var);
}
客戶
public void run()
{
while(true)
{
Test t = (Test)input.readObject();
System.out.println(t.var);
}
}
當這些程序運行服務器類的輸出是1,2,3,4 ...無限增加,而客戶端的輸出只是1,1,1,1,1,1,1等。
感謝您花時間閱讀本文。對不起,如果我只是愚蠢的,我是新來的這個東西。
編輯:對不起,讀()是由打字錯誤(我手動鍵入的代碼,因爲我不能eget正確的格式),我的意思是input.readObject()
相關問題:http://stackoverflow.com/questions/15675262/。 – 2016-07-18 04:18:44