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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам