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

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

Ответ 1

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

АННОТАЦИЯ: Предотвращение сериализации Чувствительные поля данных, содержащие чувствительные данные не должны сериализованная; это делает их ценности для любой стороны, имеющей доступ к поток сериализации. Есть несколько методов предотвращения поля от сериализации:

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

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

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

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

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

Ответ 2

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

Ответ 3

Это то, что преходящее означает ключевое слово. Его цель состоит в том, чтобы остановить сериализацию данных по любой причине.

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

private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException

Ответ 4

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

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

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