В полдень пользователь сети написал, что они с интервьюером занимались сексом. Прочитав его описание, я не смог удержаться от смеха. Что происходит в последнее время по всему Интернету? Почему? даже интервьюер занимается сексом?
Вероятно, это так: во время интервью этого пользователя сети спросили об основном принципе реализации интерфейса Serializable. Поскольку это культовый пустой интерфейс, большинству студентов нужно знать, как использовать его только во время учебы (честно говоря, Brother Build). Я не изучал это подробно раньше. Они все используются так, как приходят), и они почти не обращают внимания на основные вещи. То же самое относится и к этому пользователю сети. В этом случае он, естественно, ответил с угрызениями совести. Теперь интервьюер воспользовался этим и дал ему. Сумасшедший выход личных нападок превратил сцену интервью в слезоточивую сцену. Подробности смотрите на скриншотах чата 😂😂😂.
Основываясь на опыте интервью этого пользователя сети, Brother Build поспешно заново выучил ключевое слово Serializable и его реализацию. Чтобы к тому времени не подвергнуться критике, давайте рассмотрим его вместе.
Во-первых, давайте поймем две концепции сериализация
и противоположныйсериализация
。
Процесс сериализации ифа сериализации можно увидеть на рисунке ниже:
Есть проблема,если в моем объекте,Что делать, если некоторые переменные не хотят сериализоваться?
отвечать:не хочу бытьсериализацияпеременных мы можемкиспользоватьtransient
илиstatic
Изменение ключевого слова;transient Функция ключевого слова состоит в том, чтобы предотвратить изменение тех переменных в экземпляре, которые изменяются с помощью этого ключевого слова, когда объект переворачивается; transient Измененные значения переменных не будут сохраненыивосстанавливаться;иstaticИзменение ключевого слова Переменные не принадлежат самому объекту,Так что сериализации и не будет! конкретные причины,Мы объясним позже,Читайте дальше.
Чтобы обсудить процесс сериализации и обратной сериализации объектов Java, а также роль ключевого слова Serializable во всем процессе, давайте сначала упомянем иерархия
концепция, мы как раз недавно писали о Java Блоги, связанные с IO.
Иерархия Java (ObjectInputStream и ObjectOutputStream) — метод, который может сериализовать Java Object и антисериализировать. Это эволюция основного потока ввода байтов и потока вывода.,Их использование было представлено в предыдущих сообщениях блога.,Здесь это не будет расширяться.
OK,Взяв за основу два вышеупомянутых теоретических знания,,Далее мы можем начать настоящую борьбу с сериализацией.,первый,Мы собираемся начать с создания класса с простыми свойствами.,Здесь мы создаем класс Person,Есть два атрибутивных поля: имя и возраст. Затем,Записываем объект в файл через поток ObjectOutputStream (сериализация),Затем прочитайте данные в файле через ObjectInputStream.,На выходе получается объект-человек (антисериализация).
Без дальнейших церемоний, давайте перейдем непосредственно к коду:
public class Test {
public static void main(String[] args) throws IOException {
//Инициализируем информацию об объекте
Person person = new Person();
person.setName("JavaBuild");
person.setAge(30);
System.out.println(person.getName()+" "+person.getAge());
//процесс сериализации
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E:\\person.txt"));) {
objectOutputStream.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
//Обратный процесс сериализации
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:\\person.txt"));) {
Person p = (Person) objectInputStream.readObject();
System.out.println(p.getName() + " " + p.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Затем мы выполняем это, и результат — ох! Сообщается об ошибке с указанием NotSerializableException. Причина в том, что при создании класса Person мы не реализовали интерфейс Serializable.
Многим первокурсникам это покажется странным.,Просматривая этот сериализуемый интерфейс, я обнаружил, что он пуст.,Почему мы не можем продолжать, не осознавая этого?
Следуя информации о стеке в приведенной выше ошибке, мы вводим метод writeObject0 ObjectOutputStream, чтобы выяснить это! Некоторые из исходных кодов следующие:
// Определите, имеет ли объект строковый тип, если да, вызовите writeString Способ осуществления сериализации
if (obj instanceof String) {
writeString((String) obj, unshared);
}
// Определите, является ли объект типом массива, если да, вызовите writeArray Способ осуществления сериализации
else if (cl.isArray()) {
writeArray(obj, desc, unshared);
}
// Определите, является ли объект перечислимым типом, если да, вызовите writeEnum Способ осуществления сериализации
else if (obj instanceof Enum) {
writeEnum((Enum<?>) obj, desc, unshared);
}
// Определите, имеет ли объект тип сериализация, и если да, вызовите writeOrdinaryObject Способ осуществления сериализации
else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
}
// Выдает, если объект не может быть сериализован. NotSerializableException аномальный
else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
Из этого исходного кода мы можем найти,Когда сериализация,Метод writeObject0 выполнит оценку типа объекта внутри себя.,Включает строку, массив, перечисление или сериализуемый объект.,Если эти условия не выполняются,броситNotSerializableExceptionаномальный,поэтому,Хотя в интерфейсе Serializable нет ничего,Но для его реализации необходимо инициализировать класс.,этого достаточноobj instanceof Сериализуемый, вы можете выполнять последовательные операции!
После того, как мы реализуем интерфейс Serializable в классе Person в приведенном выше тестовом коде, мы посмотрим на результаты:
сериализация и обратная сериализация прошли успешно и получили ожидаемые результаты печати.
Итак, каков их конкретный процесс реализации?
Видно, что сериализуемый Интерфейс определяется как пустой,Потому что он служит только логотипом,Сообщает программе, что реализующий ее объект доступен.,Но фактическая работа сериализации и антисериализации не требует ее завершения.,Так же как иерархия здесь является основным драйвером, осуществляющим сериализацию!
Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent по техническому созданию 2024 года.,Приходите и разделите со мной главный приз!