Вычислять дельта объекта

Я работаю над приложением, в котором клиент и сервер совместно используют объектную модель, а графические объекты могут стать довольно большими.

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

Интересно, есть ли какие-либо инструменты или проекты там или кто-нибудь имел опыт в этом.

большое спасибо

Ответ 1

На предыдущей работе у нас были большие 3-D модели, которые мы хотели разделить между клиентами. Чтобы сохранить фактические изменения модели, было бы невозможно получить размер модели и ограничения пропускной способности.

Вместо отправки всей измененной модели мы решили сериализовать операции над данными. Например, операция может быть {CUT plane: (pt1, pt2, pt3)} или {DRILLHOLE (точка, радиус, глубина)}. Это отлично подойдет для нашего приложения, хотя оно может и не соответствовать вашей модели.

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

Ответ 2

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

Ответ 3

Я планирую свою первую архитектуру N-уровня и столкнулся с этим вопросом так же, как и собираюсь опубликовать аналогичный. Весь пример кода, который Ive видел до сих пор, передает весь граф объекта по кабелю каждый раз, независимо от того, какие изменения действительно были сделаны. Я рассматривал возможность вместо этого использовать описанный выше подход. Хотя, по-видимому, дорога меньше путешествовала.

Мне нравится идея передать только дельты для каждого модифицированного свойства. Для свойств коллекции это будет то, что было добавлено и удалено. Для однозначного свойства это может быть просто новое значение. Я мог бы реализовать это в общем виде, так что накопление этих дельт было бы прозрачным для всех объектов домена. И дельта будет передаваться по всему телу в общей форме, без использования классов DTO, специфичных для моей модели домена.

Это заставило меня задуматься, не могу ли я продолжить эту идею, используя также одну и ту же структуру данных дельта-данных общего назначения для связи в направлении сервера к клиенту. В конце концов, вы можете иметь дельту, которая в основном заполняет пустой объект. Тогда я мог полностью исключить жестко кодированные классы DTO. я Googled "общие DTO" (без кавычек) и нашел this и this. Похоже, что другие уже применили эту идею на практике.