2010-08-20 94 views
2

我有一張城市地圖,包含我需要(去)序列化的街道。每個街道由城市和ID識別,就像這樣:對同一對象使用兩種不同的序列化方法

private final City city; 
private final long id; 

城市包含所有的街道名單在這個城市(City.streetList),以便保存模型時我可以做這樣的事情

serializeToFile(modelFile, currentCity); 

這工作並沒有問題,但現在我想通過網絡發送街道(也使用序列化)。當我序列化街道時,很顯然城市對象也會被序列化,以至於所有街道都會被序列化,從而導致非常大的數據包大小。

我不能讓city暫時,因爲它是唯一需要識別街道。我也不能使City.streetList爲瞬態,因爲我需要我的模型列表。

每個城市都有一個唯一的ID,所以這樣的事情應該是可能的

private void writeObject(ObjectOutputStream out) throws IOException { 
    if (serializeForNetwork) { // How can I know this here? 
     out.writeObject(city.getId()); 
    } else { 
     out.writeObject(city); 
    } 
    out.write(id); 
} 

如前所述,我不知道該對象應該怎麼知道它被寫入到網絡(調用street.setWritingToNetwork(true)序列化似乎更前比醜陋),也許這不是一個好辦法嗎?

任何想法非常感謝! :-)

回答

2

如果沒有辦法讓你知道該對象被序列化爲文件或通過網絡,你應該總是編寫城市編號而不是整個城市。有一個方法可以讓城市在給定ID的情況下查找。

另一種使用方法是序列化代理。在此pdf中查看詳細信息:Effective Java Reloaded。基本上,序列化代理與被對象的邏輯狀態序列化的對象完全不同。該對象會覆蓋writeReplace和readResolve方法,以寫入代理而不是此對象,並通過讀取代理來創建對象。代理也只會寫城市編號,而不是整個城市。

2

出路可能是重新設計您的應用程序,以便您的街道對象不再包含對城市的引用,而只是一個「城市ID」。全市對象可以去到一個單獨的散列映射:

private final long cityId; 
private final long id; 

和地方轉換器:

public static City getCity(long id) { 
    return cityMap.get(id); 
} 

序列化街道目標將變得非常小,你就必須序列化和存儲或發送citymap一旦。

相關問題