Мы можем отклонить объект Java от сериализации кроме предоставления переходного ключевого слова

Мы можем постараться не сериализировать поля при помощи transient ключевое слово. Есть ли какой-либо другой способ сделать это?

11
задан adatapost 30 August 2012 в 04:10
поделиться

4 ответа

http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html

РЕЗЮМЕ: Предотвращение сериализации Поля конфиденциальных данных, содержащие конфиденциальные данные не должны быть сериализованный; это обнажает их ценности для любой стороны, имеющей доступ к поток сериализации. Есть несколько методов предотвращения поля от сериализации:

  1. Объявить поле как частное переходное.
  2. Определите serialPersistentFields. поле рассматриваемого класса и исключить поле из списка дескрипторы полей.
  3. Напишите сериализацию для конкретного класса метод (например, writeObject или writeExternal), который не пишет поле для сериализации поток (т. е. не вызывая ObjectOutputStream.defaultWriteObject).

Вот несколько ссылок.

Объявление serialPersistenetFields.

Спецификация архитектуры сериализации.

Безопасность при сериализации объектов.

18
ответ дан 3 December 2019 в 01:45
поделиться

Если по какой-то причине переходный процесс не подходит, вы можете выполнить сериализацию напрямую, переопределив методы writeObject и readObject . Затем вы можете включить или опустить любые поля, которые вам нужны.

8
ответ дан 3 December 2019 в 01:45
поделиться

Вот что означает переходный процесс как ключевое слово. Вся его цель - остановить сериализацию данных по любой причине.

Если вам нужен более тонкий контроль над процессом, вы можете использовать методы writeObject / readObject, которые ObjectOutputStream / ObjectInputStream используют как часть процесса сериализации, и вы можете комбинировать это с некоторыми настраиваемыми аннотациями или любой логикой, какой захотите.

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException
7
ответ дан 3 December 2019 в 01:45
поделиться

Вы можете создать свой собственный протокол с помощью интерфейса Externalizable , который, на мой взгляд, лучше, чем Serializable, поскольку он не содержит частных методов, подключаемых JVM ( writeObject и readObject ). Вместо реализации интерфейса Serializable вы можете реализовать Externalizable , который содержит два метода:

public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException

В отличие от использования Serializable сейчас ничего не предоставляется бесплатно. То есть протокол полностью в ваших руках , при этом переходные / нетриансные поля перекрываются и т. Д.

4
ответ дан 3 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: