2009-08-18 2 views
10

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

+0

У меня вопрос: спрашивайте, можем ли мы это сделать через родной. –

+0

С какой целью? Почему переходный период не является хорошим решением для ваших случаев использования? – GaryF

+0

@ Bombe/@ GaryF: любопытство всегда является веской причиной. –

ответ

18

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

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

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

Вот некоторые ссылки.

Declaring serialPersistenetFields.

Serialization architecture specification.

Security in Object Serialization.

+0

можно уяснить подробнее 2-й метод .. –

+0

Объявление serialPersistenetFields - это делается с помощью специальной статической конечной переменной, называемой serialPersistentFields. – adatapost

7

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

6

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

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

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

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

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

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