我想要可序列化的引用,它只在单机器中工作。
这种类型的对象,设置为引用和序列化,然后反序列化,应该引用与序列化之前完全相同的对象。
我做出明显的解决方案:
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");
}
}
}
是否有可能以其他方式实施?
答案 0 :(得分:-1)
我明白了,我认为你不能用Java做到这一点。即使你构成了一个不同的解决方案(除了你提供的解决方案之外),你最终也会得到一个&#34; Dictionary&#34;解。因此,无论如何,您将需要存储您的人工密钥(以及某些存储中的对象),因为在Java中,在反序列化之后,如果您知道我的意思,该对象将完全分离。