предисловие
Я уже писал статью о сериализации, и файл, о котором я собираюсь рассказать сегодня, также связан с сериализацией. Однако довольно много людей не знают об этом ключевом слове или даже не знают, что оно существует.
Введение в переходное ключевое слово
В Java, когда класс реализует интерфейс java.io.Serializable, это означает, что класс можно сериализовать. Мы можем сериализовать свойства этого класса и сохранить их извне или передать данные с помощью другого jvm. Однако задумывались ли мы когда-нибудь о том, что если класс содержит приватную информацию, такую как пароль пользователя и т. д., то это свойство нельзя сериализовать наружу. Конечно, мы можем вручную установить значение null перед сериализацией, но самый элегантный способ — использовать ключевое слово transient.
Поместите ключевое слово transient перед свойством, которое мы не хотим сериализовать извне, и это свойство не будет сериализовано.
проверка кода
Предположим, у нас есть объект User следующим образом:
@Data
public class User implements Serializable {
private String username;
private transient String password;
}
Сериализуйте и десериализуйте через класс сериализатора:
@Test
public void test() {
User user = new User();
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化之前:" + user.toString());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
}
Результаты приведены ниже:
Из результатов видно, что поле пароля после десериализации отсутствует, что обратно доказывает, что пароль не участвует в сериализации при сериализации. Это именно то, для чего предназначено ключевое слово transient.
Проблема сериализации статических свойств
Некоторые читатели могут подумать, а что, если статические свойства добавить к переходным? После десериализации запрограммировано ли статическое свойство класса равным нулю? Для проверки используется следующий код:
Добавьте количество атрибутов к пользователю:
private transient static int count;
Это статическое свойство.
Сначала установите для свойства значение 10, затем сериализуйте и десериализуйте класс, а затем просмотрите статическое свойство:
@Test
public void test() {
User user = new User();
User.setCount(10);
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化之前:" + user.toString());
System.out.println("user count:"+User.getCount());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
System.out.println("user count:" + User.getCount());
}
Результат выглядит следующим образом:
По результатам статические свойства не изменились. На самом деле, независимо от того, добавлено ключевое слово transient или нет, статические свойства не будут сериализованы.
Суммировать
1) После того, как переменная изменена переходным процессом, переменная больше не будет частью постоянства объекта.
2) Ключевое слово transient может изменять только переменные, но не методы и классы.
3) Переменные, измененные ключевым словом transient, больше не могут быть сериализованы.Статическая переменная не может быть сериализована независимо от того, изменена ли она с помощью transient.