Почему передающие объекты должны реализовывать Serializable? - PullRequest
13 голосов
/ 16 марта 2010

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

Мне сказали, что это из-за репликации сеанса между серверами с балансировкой нагрузки, но я знаю, что видел другие объекты в области сеанса, которые не реализуют Serializable. Это настоящая причина?

Ответы [ 3 ]

10 голосов
/ 16 марта 2010

Поскольку для передачи по проводу их необходимо сериализовать в форму, которую можно поместить в провод.

Как двоичный файл или xml, Json или simillar

Здесь больше информации ... Должен ли какой-либо объект домена, не быть сериализуемым?

5 голосов
/ 16 марта 2010

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

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

2 голосов
/ 16 марта 2010

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

Я помню, что использовал Sun RPC (в настоящее время называется ONC RPC), который выполняет кодирование XDR. потому что компьютерные платформы / системы представляют свои данные в соответствующих формах. Например, big endian против small endian.

Но JVM, вне зависимости от машины, является байтовым порядком байтов, поэтому порядок байтов не должен быть причиной.

Структура данных в памяти компьютера имеет указатели, и все элементы объекта могут не находиться в смежном блоке памяти. Однако, когда вы передаете объект через I / O в другую систему, вы не можете передать распределение памяти этого объекта.

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

Наш уровень представления данных в сетях основан на битовом потоке. Поэтому, когда вы хотите передать данные из одной системы в другую, вы должны преобразовать размерные данные, представленные в памяти, в данные, которые могут быть переданы по сети за байтом. На самом деле, по крупицам, и это часто идет через сжатие и безопасность шифрования. Процедуры сжатия и шифрования не имеют структуры и предполагаются потоки битов. Сетевые коммутаторы не имеют структуры. Сетевая передача даже не видит биты. Биты кодируются в сигнал передачи, который часто является аналоговым синусоидой, а затем модулируются. Эти процессы не работают на многомерных / иерархических схемах oo-структурированных данных.

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

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

...