Синхронизация объектов для сокетов / сетевых подключений - Не рекомендуется использовать WCF? - PullRequest
1 голос
/ 11 ноября 2009

Каков хороший способ синхронизации объектов через сокетное соединение?

Вот то, о чем я думал до сих пор.

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

Это разумный путь? Из того, что я прочитал о том, как Raknet делает свое дело, он предлагает вам реализовать конкретные методы, которые он ожидает вызывать всякий раз, когда требуется обновить объект.

Я вижу, что это работает, возможно, неэффективно, если все данные, с которыми вы имеете дело, относятся к примитивным типам. Но как насчет других классов? Разумно ли ожидать, что пользователь API вызовет этот метод, описанный выше, в своих собственных классах? Что делать, если они используют стандартную структуру данных, для которой метод не переопределен?

Я знаю, что есть такие вещи, как WCF, которые делают это для вас, но я действительно хочу реализовать свое собственное решение, даже если оно не оптимально, как WCF.

Спасибо за любые советы ТАК пользователям! :)

1 Ответ

1 голос
/ 11 ноября 2009

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

Я бы не стал вызывать Update для каждого установщика свойств, потому что, если объект имеет много свойств, и пользователь изменит несколько из них, будут ненужные передачи по сети, и это будет медленно. Вместо этого пользователь должен вызывать такие методы, как BeginUpdate и FinishUpdate, которые могут быть вложенными (поэтому я бы сделал счетчик вложений). Когда вызывается самая внешняя версия FinishUpdate, вы синхронизируете их в сети. Сеттеры могут проверить, вызывается ли BeginUpdate (счетчик вложений больше нуля), и если нет, в этом случае выдается исключение. Вы даже можете создать одноразовый объект, который будет вызывать BeginUpdate при создании и FinishUpdate при удалении, поэтому вы можете написать:

using (var ut = new UpdateTransaction(myObject))
// UpdateTransaction constructor calls myObject.BeginUpdate
{
    myObject.MyProp = 5;
    // ...
}
// at the end of using clause Dispose is called,
// which in turn calls myObject.FinishUpdate  

Если у вас сложный набор объектов, вам нужно создать класс, который будет представлять этот набор объектов, и сохранить их все в списке. Затем BeginUpdate / FinishUpdate должны быть реализованы для этого класса, а не для отдельных объектов.

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