模式/库,用于通过网络发送对象,保持指针

时间:2011-04-11 07:20:09

标签: java design-patterns serialization pointers architectural-patterns

假设您有一个客户端和一个想要共享/同步相同模型/对象的服务器。模型指向彼此,并且您希望它们在客户端和服务器之间发送/序列化后始终指向同一对象。我目前的解决方案大致如下:

class Person {
    static Map<Integer,Person> allPeople;
    int myDogId;

    static Person getPerson(int key){
        return allPeople.get(key);
    }

    Dog getMyDog() {
        return Dog.getDog(myDogId);
    }
}

class Dog {
    static Map<Integer,Dog> allDogs;
    int myOwnersId;

    static Dog getDog(int key) {
        return allDogs.get(key);
    }

    Person getMyOwner() {
        return Person.getPerson(myOwnersId);
    }
}

但是我对这个解决方案不太满意,字段是整数和东西。这也应该是一个非常普遍的问题。所以我在这里寻找的是这个问题的名称,模式,通用解决方案或库/框架。

3 个答案:

答案 0 :(得分:2)

这里有两个问题。

  • 您是在复制客户端和服务器中的数据(如果是,为什么?)或者是一个,另一个,或者 数据库代理持有Model?
  • 每个代理如何访问(其/?)模型?

如果模型仅由一个代理(客户端,服务器,数据库)持有,那么其他代理 需要一种远程查询模型的方法(例如,各种字段的对象枚举器,getter和setter) 在抽象模型实体上操作(例如,可以实现的模型元素标识符) 正如你所做的那样整数。)

无论谁持有该模型(一个或所有),每个模型都可以自然地实现。 正常实现使每个对象只使用普通对象引用引用其他对象, 好像你已经编码了这个,没有想到代理之间的共享,而不像是什么 你做到了。

您可以将objectid与每个对象相关联,但是您的应用程序 代码不需要使用它;仅在引用远程副本时才需要它 该模型。这个objectid是否与每个对象相关联 字段,哈希表,或者即时计算只是一个实现细节。

处理此问题的一种方法是即时计算objectid。你可以这样做 如果在整个模型上有规范的生成树。在这种情况下, objectid“只是”从生成树的根到该位置的路径 对象。如果您没有生成树或计算成本太高, 你可以在创建对象时指定objectids。

正如您所建议的那样,重复的分布式模型存在真正的问题, 保持它更新,两个代理更新它。你怎么防止 一个来自同时创建一个对象(指定一个objectid) 作为另一个,但正在创建的对象是相同的objectid, 或与不同的Objectids相同?你需要远程锁定 和信号保持模型同步(这是同样的问题 多个CPU的“缓存一致性”;只需将每个对象视为缓存行。它的方式通常得到解决 是指定谁拥有主副本(可能是整个模型, 可能是模型中的单个对象)然后发出查询, 读取,读取意图修改或写入以确保 “独特”的整个模型得到更新。

答案 1 :(得分:0)

我所知道的唯一解决方案是通过网络发送完整的结构,即狗和人。然后他们将最终指向网络另一侧的正确副本。然而,该解决方案的实施取决于许多情况。例如,当您的包含关系定义树时,您可以解决此问题的方式与具有周期的图表不同。

有关详细信息,请查看this

答案 2 :(得分:0)

我想我可以使用proxy pattern