kor*_*dge 5 java serialization pointers design-patterns 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);
}
}
Run Code Online (Sandbox Code Playgroud)
但我对这个解决方案不太满意,字段是整数和东西.这也应该是一个非常普遍的问题.所以我在这里寻找的是这个问题的名称,模式,通用解决方案或库/框架.
这里有两个问题。
如果模型仅由一个代理(客户端、服务器、数据库)持有,则其他代理需要一种方法来远程查询在抽象模型实体(例如,模型元素标识符,可以像您所做的那样作为整数实现)。
无论模型由谁持有(一个或全部),每个模型都可以自然地实现。正常的实现让每个对象只是使用正常的对象引用来引用其他对象,就好像您在编码时没有考虑在代理之间共享一样,这与您所做的不同。
您可以将 objectid 与每个对象关联起来,就像您所做的那样,但您的应用程序代码不需要使用它;仅当引用模型的远程副本时才有必要。此 objectid 是否作为特殊字段、哈希表与每个对象关联,或者动态计算只是一个实现细节。
处理此问题的一种方法是即时计算 objectid。如果整个模型上存在规范生成树,则可以执行此操作。在这种情况下,objectid“只是”从生成树的根到对象位置的路径。如果您没有生成树或者计算成本太高,则可以在创建对象时分配 objectid。
正如您所建议的那样,重复的分布式模型的真正问题是让两个代理都更新它以使其保持最新状态。如何防止一个对象与另一个对象同时创建(分配一个objectid),但使用相同的objectid创建的对象不同,或者使用不同的Objectid创建的对象相同?您需要远程锁定和信号发送来保持模型同步(这与多个 CPU 的“缓存一致性”问题相同;只需将每个对象视为缓存行即可)。通常解决该问题的方法是指定谁持有主副本(可能是整个模型,也可能是模型中的各个对象),然后发出查询、读取、意图修改读取或写入以确保“独特”的整个模型得到更新。