Можем ли мы отказать java-объекту в сериализации, кроме предоставления временного ключевого слова
Мы можем избежать сериализации полей, используя transient
ключевое слово. Есть ли другой способ сделать это?
4 ответа
http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html
РЕЗЮМЕ: Предотвращение сериализации конфиденциальных данных Поля, содержащие конфиденциальные данные, не должны быть сериализованы; при этом они выставляют свои значения любой стороне, имеющей доступ к потоку сериализации. Есть несколько способов предотвратить сериализацию поля:
- Объявите поле как частный переходный процесс.
- Определите поле serialPersistentFields рассматриваемого класса и пропустите это поле из списка дескрипторов полей.
- Напишите специфичный для класса метод сериализации (т. Е. 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
сейчас ничего не предоставляется бесплатно. То есть протокол полностью находится в ваших руках, перекрывая переходные / не трианасивные поля и т. Д.