2010-03-16 6 views
9

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

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

ответ

4

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

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

+0

Спасибо. Имеет смысл. Таким образом, любой объект с ограниченным сеансом, который не реализовал Serializable, либо не поддерживал само состояние, либо работал на серверах с балансировкой нагрузки, которые не разделяли состояние? – sma

+0

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

10

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

Как бинарная, или XML, JSON или всего напоминает

Там же подробнее здесь ... Should any domain object, not be serializable?

+0

Я не думаю, что вам нужно реализовать Serializeble для того, чтобы XML или JSON маршировали без разбора по проводу. Вам это нужно для двоичных форматов - например, в RMI. Но я думаю, что основная причина заключается в том, что эти DTO являются частью HTTP-сессии и поэтому должны быть сериализованы в соответствии со спецификацией сервлета. – HDave

1

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

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

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

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

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

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

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

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

+1

* переваренное хорошее не может быть в любом случае десериализованным * Это зависит от того, что изначально было пищей. Моя собака может это сделать> :) –

+1

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