2016-07-27 13 views
0

Ich möchte eine serialisierbare Referenz haben, die nur innerhalb einer einzelnen Maschine funktioniert.Wie serialisieren/deserialisieren Referenz in Java?

Eine solche Objektart, die auf referenziert und serialisiert und anschließend deserialisiert wird, sollte genau dasselbe Objekt referenzieren wie vor der Serialisierung. Ich

Offensichtliche Lösung gemacht:

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"); 
     } 
    } 

} 

Ist es möglich, auf andere Weise zu implementieren?

+1

Es ist wirklich schwer zu verstehen, wonach Sie fragen. Bitte versuchen Sie, es selbst zu lesen und fügen Sie weitere Informationen hinzu und formulieren Sie es um. – Divers

+0

Vielleicht verwenden Sie einen Code, um zu zeigen, was was ist und was serialisiert werden muss. – user1803551

+0

Sie können dies über die 'readResolve()' Methode implementieren. – EJP

Antwort

-1

Ich habe den Punkt und ich denke, Sie können es nicht in Java tun. Selbst wenn Sie eine andere Lösung (als die, die Sie angeboten haben) machen, werden Sie am Ende mit einer Variante der "Wörterbuch" -Lösung enden. Daher müssen Sie Ihre künstlichen Schlüssel (und Objekte in einem Speicher) sowieso speichern, da in Java nach der Deserialisierung das Objekt vollständig getrennt ist, wenn Sie wissen, was ich meine.

+0

Warum unten abstimmen? Wenn Sie eine bessere Antwort wissen, warum ist es nicht hier? –