2010-09-27 1 views
4

Я отправляю идентификаторы объектов взад и вперед от клиента к серверу через механизм RPC GWT. Иды выходят из хранилища данных как Longs (8 байтов). Я думаю, что для всех моих идентификаторов потребуется всего 4 байта, но что-то случайное могло бы, что дает мне 5-байтовое (или другое) значение.Выполняет ли GWT сериализацию java.lang.Longs эффективно?

Является ли GWT умным об упаковке этих значений в некоторой кодировке переменной длины, которая экономит место в среднем? Могу ли я указать, что он делает это где-то? Или я должен написать свой собственный код, чтобы скопировать Longs в ints и следить за этими исключительными ситуациями?

Благодаря ~

ответ

4

Как указано в GWT documentation.

долго: JavaScript не имеет 64-битный целочисленный тип, так долго нуждается в специальном рассмотрении. До GWT 1.5 длинный тип был просто сопоставлен с интегральным диапазоном 64-битного значения с плавающей запятой JavaScript, давая длинным переменным фактический диапазон меньше, чем полные 64 бита. Начиная с GWT 1.5, длинные примитивы эмулируются как пара 32-битных целых чисел и работают надежно во всем 64-битном диапазоне. Переполнение эмулируется в соответствии с ожидаемым поведением. Есть пара предостережений. Тяжелое использование длинных операций будет иметь влияние на производительность из-за базовой эмуляции. Кроме того, длинные примитивы не могут использоваться в коде JSNI, потому что они не являются родным числовым типом JavaScript.

Если ваши идентификаторы могут вписываться в целое число, вам может быть лучше с этим. В противном случае, если вы используете DTO, сделайте идентификаторы двойными, что на самом деле существует в Javascript.

4

GWT использует GZIP сжатие для ответов с полезной нагрузкой 256 байт или больше. Это должно хорошо работать, если в вашем ответе много нулевых байтов.

От RemoteServiceServlet.shouldCompressResponse:

Определяет, должен ли или должен не GZIP сжатый ответ на данный запрос сервлета. Этот метод является , который вызывается только в тех случаях, когда запрашивающий принимает кодировку GZIP.

Эта реализация в настоящий момент возвращает true, если длина байта ответа длиннее, чем 256 байтов. Подклассы могут переопределять эту логику .

Итак, сервер сначала проверяет, принимает ли запросчик (как правило, браузер) кодировку GZIP. Внутри используется java.util.zip.GZIPOutputStream - см. RPCServerUtils. На стороне клиента это работа браузера decompress the gzipped payload - так как это делается в собственном коде, это должно быть довольно быстро.

+0

Уверены ли вы? Не могли бы вы предоставить ссылку на документацию или где-нибудь еще, где это указано? Gzipping полезной нагрузки обычно является работой HTTP-сервера, а не приложения. –

+0

Я не уверен, что он документирован где угодно, но исходный код не лжет. Внутренняя работа RemoteServiceServlet удивительно проста в том, чтобы следовать, так как грандиозный тур начинается с processPost, но здесь важна запись writeResponse (а также RPCServletUtils.writeResponse). Все это делается по протоколу HTTP, устанавливая заголовок кодировки содержимого, поэтому разуборка обрабатывается автоматически браузером. – dslh

+0

@hambend: Это интересно, потому что JS работает довольно медленно, когда вы делаете такие вещи, как кодирование/сжатие и т. Д. (Зависит от браузера). Я полагаю, это может быть проблемой при обработке больших запросов (скажем, 100 кБ). Я не пробовал gzipping на стороне клиента, но я сделал некоторые эксперименты с RC4-шифрованием, а IE очень медленно запускает предупреждения о сценариях. Так есть ли возможность отключить gzipping? –

 Смежные вопросы

  • Нет связанных вопросов^_^