2012-10-13 71 views
0

之間的效果我用ObjectOutputStream的客戶端和服務器之間的基於Socket的連接。聊齋志異「緩存」客戶端和服務器

序列化和交換的對象具有這樣的結構:

public class RichiestaSalvataggioArticolo implements Serializable { 

     private ArticoloDati articolo; 

     public RichiestaSalvataggioArticolo(ArticoloDati articolo) { 
       this.articolo = articolo; 

     } 

     @Override 
     public void ricevi(GestoreRichieste gestore) throws Exception { 
       gestore.interpreta(this);      
     } 


     public ArticoloDati getArticolo() { 
       return articolo; 
     } 

} 

的問題是,當我嘗試incapsulated內容非常相似(ArticoloDati只有2場的人不同了10 C/S之間交換消息),客戶發送一個ArticoloDati,但服務器收到前一個。

ObjectOutputStream是否在調用之間實現某種緩存或內存,但無法識別出我的2個對象是不同的,因爲它們非常相似?

+0

你試過以後每次沖洗你輸出的東西流? – OmniOwl

+0

@Vipar是的,我做到了。 – alessiop86

回答

0

你需要禁用系列化「反向引用」,所以用ObjectOutputStream.writeUnshared

將一個「未共享」對象寫入ObjectOutputStream。此方法是相同的writeObject,不同之處在於它總是給定的對象寫入作爲流中的一個新的,獨特的對象(而不是一個向後引用指向先前串行化實例)。

在某些情況下將其與ObjectInputStream.readUnshared耦合是一種很好的做法 - 包括這一項。

+0

我需要做一些測試,但我接受了答案,這就是我需要知道 – alessiop86

+0

@馬克你的'RichiestaSlavataggioArticolo'對象具有相同的身份,只有它的狀態已經改變什麼;它的現有序列化副本(具有外的日期的狀態)被存儲在服務器側和客戶端僅於先前序列化對象寫入的參考。這種行爲是故意的,可以使用非共享方法避免。 – oldrinb