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

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

4 ответа

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

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

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

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

Объявление 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, теперь ничего не предоставляется бесплатно. То есть протокол полностью находится в ваших руках, переполняя переходные/не triansient поля и т.д.

licensed under cc by-sa 3.0 with attribution.