【问题标题】:Pattern/Library for sending objects over network, keeping pointers用于通过网络发送对象、保存指针的模式/库
【发布时间】:2011-08-02 20:19:36
【问题描述】:

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

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);
    }
}

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

【问题讨论】:

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


【解决方案1】:

我知道的唯一解决方案是通过网络发送完整的结构,即 Dogs 和 Persons。然后他们最终会指向网络另一端的正确副本。然而,该解决方案的实施取决于很多情况。例如,当您的包含关系定义一棵树时,您可以以不同于它是带有循环的图的方式解决这个问题。

查看this 了解更多信息。

【讨论】:

    【解决方案2】:

    这里有两个问题。

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

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

    无论谁持有模型(一个或全部),每个模型都可以自然实现。 正常的实现让每个对象都使用正常的对象引用简单地引用其他对象, 就好像你在没有考虑在代理之间共享的情况下编写了这个代码,不像什么 你做到了。

    您可以将 objectid 与每个对象相关联,就像您一样,但您的应用程序 代码不需要使用它;只有在引用远程副本时才需要 的模型。此 objectid 是否作为特殊对象与每个对象关联 字段、哈希表或动态计算只是一个实现细节。

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

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

    【讨论】:

      【解决方案3】:

      我想可以为此使用proxy pattern

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 2015-11-13
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多