2016-06-08 4 views
0

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

+3

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

+0

Сериализуемый класс может быть записан и прочитан из файла автоматически с помощью java (при условии, что он имеет доступ к классу). Это позволяет вещам вроде JMS Queue писать классы в файл, когда сообщение, содержащее класс, находится в очереди. – DwB

ответ

2

Безопасность и сериализация - разные.

Сериализация Java - это преобразование объектов в байты. Период.

Поле optional UID предназначено для обеспечения соответствия серийных и десериализованных объектов (конструкций).

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

+0

Основная причина, по которой я спрашивал, заключается в том, что у меня есть серверная программа, которая собирает информацию о пользователе от клиента и сохраняет ее в базе данных. Клиент (который является андроидным приложением) может затем запрашивать информацию из базы данных, которую сервер преобразует данные каждого пользователя в объекты. Я беспокоился о том, чтобы отправить «List ' поверх объекта ObjectOutputStream и как он будет выглядеть на стороне клиента при его отправке с сервера на клиент @ K139 –

+0

@ Darkman9333 Считаете ли вы использование служб REST?Почему вы хотите отправлять сериализованные классы? – K139

+0

Я был направлен в сторону служб REST, но я полагаю, что вся идея состояла в том, что я не хотел полагаться на сторонние базы данных, а что нет (не то, что я не доверяю им данные, просто что я больше делаю это для обучения) –

0

Вы правы, но вы можете думать об этом более широко.

  • Вы можете конвертировать сериализуемую класс байты

  • Вы можете добавить объект этого типа сериализуемой коллекции и будет правильно сериализовать (например, вы можете сделать их список и сериализациями список, если список является сериализуемым)

Кстати, serialVersionUID не является обязательным. Он будет генерировать один сам по себе, хотя он будет немного более хрупким - если вы измените, например, подпись метода, jvm переведет это на измененную подпись и верят, что класс теперь несовместим с предыдущими сериализованными версиями, даже если вы не изменили поля данных. Если вы создаете свой собственный, вы, по сути, переопределяете этот механизм.

+0

, поэтому для обеспечения того, чтобы объект был одинаковым на обоих концах, оба получающих и отправляющих конца должны иметь один и тот же serialVersionUID? –

+0

Некоторые IDE предупредит вас, если он отсутствует, но он по-прежнему является необязательным. Если вы оставите это, jvm будет генерировать один, основанный на полях, сигнатурах методов и т. Д. И т. Д. Если вы отправляете это по сети, на принимающей стороне, вашему jvm все равно потребуется определение класса для сериализации байтов в , поэтому он будет использовать это для создания svid. Если вы включите свою собственную, сериализация будет работать до тех пор, пока совпадают поля (это также, предположительно, небрежно быстрее). Обратите внимание, что если вы хотите использовать это для сетей, большинство выделенных библиотек (например, бережливость) намного быстрее, чем базовая jvm-сериализация. –

+0

Действительно, следует изучить разделы по Serializable в «Эффективной Java», Джошуа Блох. –

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