О причинах, по которым интервьюер парировал во время интервью: «Несколько лет я потратил на аспирантуру зря»
О причинах, по которым интервьюер парировал во время интервью: «Несколько лет я потратил на аспирантуру зря»

В полдень пользователь сети написал, что они с интервьюером занимались сексом. Прочитав его описание, я не смог удержаться от смеха. Что происходит в последнее время по всему Интернету? Почему? даже интервьюер занимается сексом?

   Вероятно, это так: во время интервью этого пользователя сети спросили об основном принципе реализации интерфейса Serializable. Поскольку это культовый пустой интерфейс, большинству студентов нужно знать, как использовать его только во время учебы (честно говоря, Brother Build). Я не изучал это подробно раньше. Они все используются так, как приходят), и они почти не обращают внимания на основные вещи. То же самое относится и к этому пользователю сети. В этом случае он, естественно, ответил с угрызениями совести. Теперь интервьюер воспользовался этим и дал ему. Сумасшедший выход личных нападок превратил сцену интервью в слезоточивую сцену. Подробности смотрите на скриншотах чата 😂😂😂.

Основываясь на опыте интервью этого пользователя сети, Brother Build поспешно заново выучил ключевое слово Serializable и его реализацию. Чтобы к тому времени не подвергнуться критике, давайте рассмотрим его вместе.

1. Сериализация и десериализация

Во-первых, давайте поймем две концепции сериализация и противоположныйсериализация

  • сериализация: Процесс преобразования объекта Java в последовательность байтов (включая такую ​​информацию, как данные объекта, тип объекта и атрибуты, хранящиеся в объекте), который облегчает передачу по сети или сохранение в файле.
  • противоположныйсериализация: Это процесс, обратный сериализации, процесс преобразования последовательностей байтов в объекты Java.

1.1 Сценарии применения сериализации и десериализации

  • Объект передается по сети (например, методом удаленного вызова). RPC (время) требуется перед сериализацией,После получения объекта сериализации необходимо произвести обратную сериализацию;
  • сериализацию необходимо выполнить перед сохранением объектов в файлы (например, загрузкой и выгрузкой в ​​Excel в системе), а обратная сериализация необходима для чтения объектов из файлов;
  • Сохраняйте объекты в базе данных (например, Redis) ранее необходимо было использовать сериализацию, а чтение объекта из кэша базы данных требовало антисериализации;
  • необходима сериализация перед сохранением объектов в памяти,После прочтения его из памяти его нужно перевернуть.

Процесс сериализации ифа сериализации можно увидеть на рисунке ниже:

Есть проблема,если в моем объекте,Что делать, если некоторые переменные не хотят сериализоваться?

отвечать:не хочу бытьсериализацияпеременных мы можемкиспользоватьtransientилиstaticИзменение ключевого слова;transient Функция ключевого слова состоит в том, чтобы предотвратить изменение тех переменных в экземпляре, которые изменяются с помощью этого ключевого слова, когда объект переворачивается; transient Измененные значения переменных не будут сохраненыивосстанавливаться;иstaticИзменение ключевого слова Переменные не принадлежат самому объекту,Так что сериализации и не будет! конкретные причины,Мы объясним позже,Читайте дальше.

2. Поток операций в Java

    Чтобы обсудить процесс сериализации и обратной сериализации объектов Java, а также роль ключевого слова Serializable во всем процессе, давайте сначала упомянем иерархия концепция, мы как раз недавно писали о Java Блоги, связанные с IO.

Иерархия Java (ObjectInputStream и ObjectOutputStream) — метод, который может сериализовать Java Object и антисериализировать. Это эволюция основного потока ввода байтов и потока вывода.,Их использование было представлено в предыдущих сообщениях блога.,Здесь это не будет расширяться.

  • ObjectOutputStream: записать последовательность байтов после сериализации в файл.、Сеть и другие выходные потоки.
  • ObjectInputStream: можно прочитать ObjectOutputStream Записанный поток байтов преобразуется в соответствующий объект (включая данные объекта, тип объекта и атрибуты, хранящиеся в объекте и т. д.).

3. Практика сериализации

    OK,Взяв за основу два вышеупомянутых теоретических знания,,Далее мы можем начать настоящую борьбу с сериализацией.,первый,Мы собираемся начать с создания класса с простыми свойствами.,Здесь мы создаем класс Person,Есть два атрибутивных поля: имя и возраст. Затем,Записываем объект в файл через поток ObjectOutputStream (сериализация),Затем прочитайте данные в файле через ObjectInputStream.,На выходе получается объект-человек (антисериализация).

Без дальнейших церемоний, давайте перейдем непосредственно к коду:

Язык кода:java
копировать
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, чтобы выяснить это! Некоторые из исходных кодов следующие:

Язык кода:java
копировать
// Определите, имеет ли объект строковый тип, если да, вызовите 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 в приведенном выше тестовом коде, мы посмотрим на результаты:

сериализация и обратная сериализация прошли успешно и получили ожидаемые результаты печати.

Итак, каков их конкретный процесс реализации?

  • сериализация: к ObjectOutputStream Например, просматривая исходный код, мы обнаружили, что он будет вызываться последовательно при сериализации. writeObject()→writeObject0()→writeOrdinaryObject()→writeSerialData()→invokeWriteObject()→defaultWriteFields()。
  • противоположныйсериализация: к ObjectInputStream Например, он будет вызываться последовательно при антисериализации. readObject()→readObject0()→readOrdinaryObject()→readSerialData()→defaultReadFields()。

4. Резюме

Видно, что сериализуемый Интерфейс определяется как пустой,Потому что он служит только логотипом,Сообщает программе, что реализующий ее объект доступен.,Но фактическая работа сериализации и антисериализации не требует ее завершения.,Так же как иерархия здесь является основным драйвером, осуществляющим сериализацию!

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent по техническому созданию 2024 года.,Приходите и разделите со мной главный приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.