簡體   English   中英

ObjectStream中可變對象的影響

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM