Мы можем избежать сериализации полей, используя ключевое слово transient
. Есть ли другой способ сделать это?Можем ли мы отказаться от объекта Java от сериализации, отличного от предоставления ключевого слова переходного процесса
ответ
http://java.sun.com/javase/6/docs/platform/serialization/spec/security.html
РЕЗЮМЕ: Предотвращение сериализации чувствительных полех данных, содержащих конфиденциальных данных не должно быть сериализованными; это предоставляет значения для любой стороны, имеющей доступ к потоку сериализации . Есть несколько методов для предотвращения поля от сериализации:
- Объявляет поле частных преходящий.
- Определите поле serialPersistentFields поля данного класса и опустите поле из списка дескрипторы полей.
- Написать класс специфических сериализации метод (т.е. writeObject или writeExternal), который не пишет поле в потоке сериализации (то есть, не вызывая ObjectOutputStream.defaultWriteObject).
Вот некоторые ссылки.
Declaring serialPersistenetFields.
можно уяснить подробнее 2-й метод .. –
Объявление serialPersistenetFields - это делается с помощью специальной статической конечной переменной, называемой serialPersistentFields. – adatapost
Если по какой-то причине переходный процесс не подходит, вы можете выполнить сериализацию напрямую, переопределив методы writeObject and 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, что на мой взгляд это лучше, чем Сериализуемый, поскольку он не содержит частные методы подсел на JVM (writeObject
и readObject
). Вместо реализации интерфейса Serializable
, вы можете реализовать Externalizable
, который содержит два метода:
public void writeExternal(ObjectOutput out) throws IOException;
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
В отличие от не использования Serializable
ничего предоставляется бесплатно сейчас, хотя. То есть, протокол полностью находится в ваших руках, переполнение переходных/невращающих полей и т. Д.
У меня вопрос: спрашивайте, можем ли мы это сделать через родной. –
С какой целью? Почему переходный период не является хорошим решением для ваших случаев использования? – GaryF
@ Bombe/@ GaryF: любопытство всегда является веской причиной. –