如何在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中,如果您知道我的意思的话,在反序列化之后,对象是完全分离的。

最新更新