2016-07-27 8 views
0

私はシリアライズ可能な参照をしたいと思います。これは単一のマシンでのみ動作します。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

あなたは何を求めているのか分かりません。あなた自身でそれを読んで、さらに情報を追加して、それを言い換えるようにしてください – Divers

+0

何が何であるか、そして何が直列化される必要があるかを示すためにいくつかのコードを使用するかもしれません。 – user1803551

+0

これは 'readResolve()'メソッドで実装できます。 – EJP

答えて

-1

私はポイントを得て、私はあなたがJavaでそれをすることはできないと思う。たとえあなたが提供したソリューション以外の別のソリューションを構成しても、いずれにしても、 "辞書"ソリューションのバリエーションが得られます。とにかく、Javaで、逆シリアル化の後、オブジェクトが完全に分離されているので、私の意図が分かっていると、あなたの人工キー(およびオブジェクトをいくつかのストレージに保存する必要があります)。

+0

なぜ投票が遅れますか?あなたがより良い答えを知っているなら、なぜそれがここにないのですか? –

関連する問題