Мы можем избежать сериализации полей с помощью ключевого слова transient
.
Есть ли другой способ сделать это?
Можем ли мы отказать в Java-объекте от сериализации, отличной от предоставления ключевого слова 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 поля и т.д.