Шаблон / Библиотека для отправки объектов по сети, сохраняя указатели - PullRequest
5 голосов
/ 11 апреля 2011

Допустим, у вас есть Клиент и Сервер, которые хотят совместно использовать / синхронизировать одни и те же Модели / Объекты. Модели указывают друг на друга, и вы хотите, чтобы они продолжали указывать на один и тот же объект после отправки / сериализации между клиентом и сервером. Мое текущее решение выглядит примерно так:

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 ]

2 голосов
/ 11 апреля 2011

Здесь есть две проблемы.

  • Реплицируете ли вы данные на клиенте и на сервере (если да, почему?) Или один, другой или агент базы данных удерживают модель?
  • Как каждый агент получает доступ к своей модели (* / 100) *

Если модель поддерживается только одним агентом (клиент, сервер, база данных), тогда другим агентам требуетсяспособ удаленного запроса модели (например, перечислителей объектов, методов получения и установки для различных полей), работающих с абстрактными объектами модели (например, идентификаторами элементов модели, которые могут быть реализованы как целые числа, как вы сделали).

Независимо от того, кто владеет моделью (одна или все), каждая модель может быть реализована естественным образом.В обычной реализации каждый объект просто ссылается на другие объекты, используя обычные ссылки на объекты, как если бы вы кодировали это, не думая о совместном использовании между агентами, и в отличие от того, что вы делали.

Вы можете связать объект с каждым объектом, как у вас, но код вашего приложения не должен его использовать;это необходимо только при обращении к удаленной копии модели.Независимо от того, связан ли этот объект с каждым объектом как специальное поле, хеш-таблица или вычисляется на лету, это просто деталь реализации.

Один из способов справиться с этим - вычислить объект на лету.,Вы можете сделать это, если существует каноническое остовное дерево по всей модели.В этом случае объект является «просто» путем от корня связующего дерева до местоположения объекта.Если у вас нет связующего дерева или его вычисление слишком дорого, вы можете назначать объекты при создании объектов.

Настоящая проблема с дублированной распределенной моделью, которая, как вы предлагали, есть, заключается в сохраненииэто актуально с обоими агентами, обновляющими это.Как вы препятствуете тому, чтобы один создал объект (назначение объекта) одновременно с другим, но создаваемые объекты отличаются с одним и тем же объектом или одинаково с различными объектами?Вам понадобится удаленная блокировка и сигнализация, чтобы синхронизировать модели (это та же проблема, что и «когерентность кэша» для нескольких процессоров; просто представьте, что каждый объект действует как строка кэша).Обычно это решается путем определения того, кто хранит главную копию (возможно, всей модели, возможно, отдельных объектов в модели), а затем выдает запросы, читает, читает с намерением изменить или пишет для обеспечениячто «уникальная» целая модель обновляется.

0 голосов
/ 21 апреля 2011

Полагаю, для этого можно использовать прокси-шаблон .

0 голосов
/ 11 апреля 2011

Единственное известное мне решение - это отправить всю структуру, т.е. собак и людей по сети.Тогда они в конечном итоге будут указывать на правильную копию на другой стороне сети.Однако реализация этого решения зависит от многих обстоятельств.Например, когда ваше отношение включения определяет дерево, вы можете решить эту проблему иначе, чем если бы это был график с циклами.

Для получения дополнительной информации посмотрите this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...