我目前正在考慮Java Swing WebStart應用程序(胖客戶端)和運行在Tomcat上的一些遠程服務之間的遠程處理/序列化的一些設計細節。我想使用一個http兼容的傳輸與服務器通信,因爲我已經使用Spring,我認爲Spring的HTTP Remoting是一個不錯的選擇。但我可以在這裏接受其他選擇。我的設計問題最好用一些小例子來說明使用遠程服務的Java序列化和實例共享
客戶端將在遠程端調用一些服務。示例服務接口:
public interface ServiceInterface extends Serialiazable {
// Get immutable reference data
public List<Building> getBuildings();
public List<Office> getOffices();
// Create, read and update Employee objects
public insertEmployee(Employee employee);
public Employee getEmployee();
public void updateEmployee(Employee employee);
}
Building和Office是不可變的引用數據對象,例如,
public Building implements Serializable {
String name;
public Building(String name) { this.name = name; }
public String getName() { return name; }
}
public Office implements Serializable {
Building building;
int maxEmployees;
public Office(Building building, int maxEmployess) {
this.building = building;
this.maxEmployees = maxEmployees;
}
public Building getBuilding() { return building; }
punlic int getMaxEmployees() { retrun maxEmployees; }
}
可用的建築物和辦公室在運行時不會改變,應該由客戶來prefeteched有可供選擇的列表,過濾條件,......我想有每個特定的建築只有一個實例Office和客戶端以及一個實例在服務器端。在服務器端,這不是一個大問題,但在我眼裏,當我在getBuildings()之後調用getOffices()時,問題就從這裏開始。由getOffices()返回的建築物共享相同的建築物實例(如果它們具有相同的建築物分配),但由getOffices()返回的建築物(在Office對象中引用)與getBuildings()返回的建築物不同。
這可能是通過使用getReferenceDate()方法在同一個調用中返回兩個信息來解決的,但是如果我有員工引用辦公室,問題將會開始。
我正在考慮一些自定義序列化(readObject,writeObject)只傳遞主鍵,而不是從持有引用數據對象的某個類獲取對象的實例。但這是解決這個問題的最佳方案嗎?我認爲這個問題並不罕見,但在Google上沒有發現任何問題。有更好的解決方案嗎?如果不是,那麼實施它的最好方法是什麼?