我有一个复杂的对象图来表示操作调度。 有一次,我必须将整个图表序列化到Web UI(通过XML / JSON),以便用户使用基于Javascript的甘特图组件修改计划。 用户完成编辑后,Java /服务器层中的图形状态必须与修改后的状态同步。
我想问一下实现复杂对象图的状态同步的最佳策略,例如:应该如何表示状态的变化,以便模拟服务器端的变化? 别人怎么会实现这个呢?
仅供参考,我目前的技术堆栈:JSF + Richfaces,Seam 2.1,Hibernate 3。 但我相信这个问题的解决方案也可以用于其他技术堆栈。
答案 0 :(得分:4)
我建议避免同步两个图,但将编辑操作记录为“删除节点/插入节点/替换节点”操作。将此操作发送到服务器并将其应用于原始图表。
这个想法源于重写AST(抽象语法树)。在eclipse JDT you have an AST from your source。当应用重构(例如重命名方法)时,应该可以创建更改的预览。为此,重写事件(Delte / Insert / Replace)被记录并应用于AST的副本。从此生成预览。如果用户接受将事件应用于原始AST。
你的问题是这样的,你有两个开始相同的对象图,应该以相同的方式修改。这应该更容易实现为同步操作,您只需在用户修改图形时记录事件。
答案 1 :(得分:0)
我正在研究一个具有相同(正常?)问题的大型项目。设计人员基于DTO模式和CMP2实现了以下解决方案:
一般的想法是,每个表示图中对象的bean都可以记录自己的更改。因此,每个bean都有一个额外的结构(集合),其中只存储已更改的bean属性(值)的键(列名)。服务器逻辑使用这些提示来更新存储的数据。服务器逻辑可以使用这些提示仅更新更改。
(简化!)bean本身看起来有点像这样:
public TableBean {
private String column1;
// ... more fields
private Set<String> changes = new Set<String>();
public String getColumn1() {
return column1;
}
public void setColumn1(String value) {
if (!value.equals(column1)) {
changes.add("column1");
column1 = value;
}
}
public Collection<String> getChanges() {
return changes;
}
}
相应地处理子关系,还有另一个记录那些必须删除的子图的结构。
这甚至可能是标准的j2ee模式,请在这种情况下发表评论。
(除此之外,我赞成Arne的新设计解决方案!)