簡體   English   中英

如何在Java中序列化/反序列化引用?

[英]How to serialize/deserialize reference in Java?

我想擁有可序列化的參考,該參考只能在單台機器上使用。

設置為引用並序列化然后反序列化的此類對象應引用與序列化之前完全相同的對象。

我提出的明顯解決方案:

public class ReferenceSerializable<T> implements Serializable {

   public static final DataFormat REFERENCE = new DataFormat("application/prs.reference");

   private static Int2ObjectOpenHashMap<WeakReference<Object>> map = new Int2ObjectOpenHashMap<>();

   private T referent;
   private int identity;

   public ReferenceSerializable(T referent) {
      this.referent = referent;
      identity = System.identityHashCode(referent);
      if( !map.containsKey(identity) ) {
         map.put(identity, new WeakReference<Object>(referent));
      }

   }

   private void writeObject(java.io.ObjectOutputStream out) throws IOException {
      out.writeInt(identity);
   }

   private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
      identity = in.readInt();
      referent = (T) map.get(identity).get();
      if( referent == null ) {
         throw new IllegalStateException("Object does not exist anymore, reference is obsolete");
      }
   }

}

是否可以實現其他方式?

我明白了,我想您不能用Java做到這一點。 即使您提出了一個不同的解決方案(不同於您提供的解決方案),您最終還是會得到“詞典”解決方案的變體。 因此,無論如何,您都將需要存儲人工密鑰(和對象在某些存儲中),因為在Java中,反序列化之后,如果您知道我的意思,則對象是完全分離的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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