2016-07-27 47 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

爲什麼選擇投票?如果你知道更好的答案,爲什麼它不在這裏? –