Java Transient Ключевые слова
1. Метод переходного процесса функции и использования
Мы все знаем, что до тех пор, пока объект реализует серилизуемый интерфейс, объект может быть сериализован. Эта модель сериализации Java обеспечивает много удобства для разработчиков. Мы не должны относиться к конкретному процессу сериализации. Пока этот класс реализует серилизуемый интерфейс, все свойства и методы этого класса будут автоматически сериализованы.
Однако в реальном процессе разработки мы часто сталкиваемся с такими проблемами. Некоторые свойства этого класса должны быть сериализованы, в то время как другие свойства не должны быть сериализованы. Например, если у пользователя есть некоторая конфиденциальная информация (такая как пароли, номера банковских карт и т. Д.), По соображениям безопасности, он не хочет, чтобы его передавали в сетевых операциях (в основном включающие операции сериализации, также применимы к классу локальной сериализации), а переменные, соответствующие этой информации, могут быть добавлены с помощью переходного ключевого слова. Другими словами, жизненный цикл этого поля находится только в памяти вызывающего абонента и не записан на диск для настойчивости.
Короче говоря, переходное ключевое слово Java предоставляет нам удобство. Вам нужно только реализовать серилизуемый интерфейс и добавить переход ключевого слова, прежде чем атрибуты, которые не должны быть сериализованы. При сериализации объекта этот атрибут не будет сериализован на указанный пункт назначения.
Пример кода заключается в следующем:
Импорт java.io.fileinputstream; import java.io.filenotfoundexception; импорт java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.objectInputStream; импорт java.io.objectOutputStream; импорт java.io.serialize Переменная * Обратите внимание, что при чтении порядок данных чтения должен соответствовать порядку хранения данных * * @author Alexia * @date 2013-10-15 * http://www.manongjc.com/article/1609.html */public class transientTest {public static void main (строгие [] args) {пользователь пользователя = новый пользователь ();););););););); user.setusername ("Alexia"); user.setpasswd ("123456"); System.out.println («Читать перед Serializable:»); System.out.println ("username:" + user.getusername ()); System.err.println ("Password:" + user.getPasswd ()); try {objectOutputStream OS = new ObjectOutputStream (new FileOutputStream ("c: /user.txt")); OS.WriteObject (пользователь); // Записать объект пользователя в файл os.flush (); os.close (); } catch (filenotFoundException e) {e.printstackTrace (); } catch (ioException e) {e.printstackTrace (); } try {objectInputStream IS = new ObjectInputStream (new FileInputStream ("c: /user.txt")); user = (user) is.readobject (); // Читать данные пользователя из потока is.close (); System.out.println ("/nread после serializable:"); System.out.println ("username:" + user.getusername ()); System.err.println ("Password:" + user.getPasswd ()); } catch (filenotFoundException e) {e.printstackTrace (); } catch (ioException e) {e.printstackTrace (); } catch (classnotfoundexception e) {e.printstacktrace (); }}} класс Пользователь реализует serializable {private Static Long Long SerialVersionUID = 8294180014912103005L; частное имя пользователя; частная переходная строка Passwd; public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPasswd () {return passwd; } public void setPasswd (String passwd) {this.passwd = passwd; }}Вывод:
Читайте перед сериализуемой: Имя пользователя: AlexiApassword: 123456 Рид после сериализации: Имя пользователя: AlexiApassword: NULL
Поле пароля является нулевым, что означает, что из файла не было получено никакой информации во время десериализации.
2. Резюме переходного использования
1) После того, как переменная изменяется переходным процессом, переменная больше не будет частью настойчивости объекта, а содержимое переменной не может быть доступно после сериализации.
2) Ключевое слово Transient может изменить только переменные, но не методы и классы. Обратите внимание, что локальные переменные не могут быть изменены с помощью переходных ключевых слов. Если переменная является определенной пользовательской переменной класса, класс должен реализовать сериализуемый интерфейс.
3) переменные, модифицированные ключевым словом Transient, больше не могут быть сериализованы. Статическая переменная не может быть сериализована независимо от того, изменяется ли она переходным процессом.
Третий пункт может сбить с толку, потому что я обнаружил, что после добавления статического ключевого слова в поле пользователя в классе пользователя результат прогона программы остается неизменным, то есть имя пользователя статического типа также читается как «Алексия». Разве это не противоречит третьему пункту? На самом деле, это похоже на это: третья точка действительно верна (статическая переменная не может быть сериализована, независимо от того, изменяется ли она переходным процессом). После десериализации имя пользователя статической переменной в классе является значением соответствующей статической переменной в текущей JVM. Это значение не получено из десериализации в JVM. Не верите в это? Хорошо, позвольте мне доказать это ниже:
Импорт java.io.fileinputstream; import java.io.filenotfoundexception; импорт java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.objectInputStream; импорт java.io.objectOutputStream; импорт java.io.serialize Переменная * Обратите внимание, что при чтении порядок данных чтения должен соответствовать порядку хранения данных * * @author Alexia * @Date 2013-10-15 * http://www.manongjc.com */public class transientTest {public Static void main (String [] args) {user user = new user ();); user.setusername ("Alexia"); user.setpasswd ("123456"); System.out.println («Читать перед Serializable:»); System.out.println ("username:" + user.getusername ()); System.err.println ("Password:" + user.getPasswd ()); try {objectOutputStream OS = new ObjectOutputStream (new FileOutputStream ("c: /user.txt")); OS.WriteObject (пользователь); // Записать объект пользователя в файл os.flush (); os.close (); } catch (filenotFoundException e) {e.printstackTrace (); } catch (ioException e) {e.printstackTrace (); } try {// изменить значение имени пользователя перед Deserialization user.username = "jmwang"; ObjectInputStream is = new ObjectInputStream (new FileInputStream ("c: /user.txt")); user = (user) is.readobject (); // Читать данные пользователя из потока is.close (); System.out.println ("/nread после serializable:"); System.out.println ("username:" + user.getusername ()); System.err.println ("Password:" + user.getPasswd ()); } catch (filenotFoundException e) {e.printstackTrace (); } catch (ioException e) {e.printstackTrace (); } catch (classnotfoundexception e) {e.printstacktrace (); }}} класс Пользователь реализует serializable {private Static Long Long SerialVersionUID = 8294180014912103005L; Общественное статическое имя пользователя; частная переходная строка Passwd; public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPasswd () {return passwd; } public void setPasswd (String passwd) {this.passwd = passwd; }}Результатом работы:
Читайте перед сериализуемой: Имя пользователя: AlexiApassword: 123456 Чита после сериализации: Имя пользователя: Jmwangpassword: NULL
Это означает, что значением имени пользователя статической переменной в десериализованном классе является значение соответствующей статической переменной в текущей JVM, которая является модифицированным JMwang, а не значением Alexia во время сериализации.
3. Переходные детали использования - могут ли переменные, модифицированные ключевым словом Transient, действительно сериализованы?
Подумайте о следующих примерах:
Импорт java.io.externalibable; import java.io.file; import java.io.fileinputstream; import java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.objectInputStream; импорт java.io.objectOutpream; @date 2013-10-15 * */public Class ExternaizableStest реализует Extrabizable {Private Transie String Content = «Да, я буду сериализован независимо от того, изменяется ли я по ключевым словам переходного процесса или нет»; @Override public void writeExternal (objectOutput) бросает ioException {out.writeObject (content); } @Override public void readexternal (ObjectInput In) бросает ioException, classnotfoundexception {content = (string) in.readobject (); } public static void main (string [] args) бросает исключение {exterlastizabletest et = new ExternaizableStest (); ObjectOutput = new objectOutputStream (new FileOutputStream (new File ("test"))); out.writeobject (et); ObjectInput in = new ObjectInputStream (new FileInputStream (new File ("test"))); et = (exterlazizabletest) in.readObject (); System.out.println (et.content); out.close (); in.close (); }}Будет ли переменная контента сериализована? Хорошо, я вывел все ответы, да, результат:
Да, я буду сериализован, независимо от того, изменяется ли я по ключевым словам переходного процесса или нет
Почему это? Разве не говорится, что переменные класса не будут сериализованы после изменения ключевого слова Transient?
Мы знаем, что в Java сериализация объектов может быть реализована путем реализации двух интерфейсов. Если реализуется сериализуемый интерфейс, вся сериализация будет выполнена автоматически. Если внедрено введенный интерфейс, ничто не может быть сериализовано автоматически. Вам необходимо вручную указать переменную, сериализованную в методе WriteExternal, что не имеет ничего общего с тем, изменяется ли она Transient. Следовательно, второй пример выводит контент, инициализированный содержимым переменной, а не нулевой.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!