[英]Effects of Mutable objects in an ObjectStream
我試圖使用從Socket獲取的ObjectInputStream和ObjectOutputStream在客戶端和服務器之間發送數據包。 但是,在嘗試向下游發送對象時,我得到了一些奇怪的結果,我的類結構看起來如下:
public class Packet {
public Foo foo;
}
public class Foo {
public float hp = 100;
public double mass = 10;
public void takeDamage(float dmg) {
hp -= dmg;
Packet p = new Packet();
p.foo = this;
//code to send packet to server
}
}
但是我發現服務器到達時會收到不同的Foo值-始終正確接收質量,但是無法正確接收每秒最多可能更改50次的hp(通常接收到的大約是97,而不考慮原始對象的實際功率)。 我已經在發送數據包之前以及到達后立即檢查了hp的值,並且它似乎只是被隨機更改了,但是我認為這可能是由於p.foo是指針這一事實,就像我代替進行深拷貝:
p.foo = new Foo();
p.foo.hp = hp;
p.foo.mass = mass;
該代碼似乎可以很好地通過hp發送,那么是否必須將Streams傳遞為沒有突變的對象? 有沒有什么好方法可以在Java中執行呢?
我寫的關於ObjectOutpuStream
所有內容也都發生在ObjectInputStream
。
如果相同的實例再次被序列化,則ObjectOutputStream
緩存先前已序列化的數據以僅發送引用而不是整個數據。 這使得可以序列化循環數據結構而不會導致無限循環。 我想是因為這個原因,為什么您會收到一個不同的值(很可能是序列化的第一個值),而不是當前的值。
出於同樣的原因,您遲早會遇到OutOfMemoryError
因為ObjectOutputStream
的內部緩存會越來越大(沒有可以調用的reset
)。
因此,我想您可以通過使用不同於ObjectOutputStream
方式來更改實現,或者在發送某些信息后實例化一個新的ObjectOutputStream
(您也需要在接收方進行此操作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.