私はシリアライズ可能な参照をしたいと思います。これは単一のマシンでのみ動作します。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");
}
}
}
、それは他の方法を実施することは可能ですか?
あなたは何を求めているのか分かりません。あなた自身でそれを読んで、さらに情報を追加して、それを言い換えるようにしてください – Divers
何が何であるか、そして何が直列化される必要があるかを示すためにいくつかのコードを使用するかもしれません。 – user1803551
これは 'readResolve()'メソッドで実装できます。 – EJP