有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

序列化如何在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");
      }
   }

}

是否有可能以其他方式实施


共 (1) 个答案

  1. # 1 楼答案

    我明白了这一点,我认为用Java是做不到的。即使你制定了一个不同的解决方案(你提供的解决方案除外),你最终还是会得到一个“字典”解决方案的变体。因此,无论如何,您都需要存储您的人工键(以及一些存储中的对象),因为在Java中,在反序列化之后,对象是完全分离的,如果您知道我的意思的话