Активный сериализатор – это современный байт-кодегенератор чрезвычайно быстрых и компактных сериализаторов для передачи данных. Его основными функциями являются максимальная производительность и оптимизированная модель программирования. Активный сериализатор не создает избыточных слоев объектов передачи данных и работает напрямую с классами Java с помощью аннотаций.
Активный сериализатор действительно мощный инструмент:
- Работает непосредственно с классами Java с помощью аннотаций. Никаких дополнительных уровней промежуточных классов DTO.
- Реализовано с использованием генерации байт-кода во время выполнения, чтобы быть совместимым с динамически создаваемыми классами.
- Стабильный двоичный формат с обратной двоичной совместимостью.
- Поддержка эволюции схемы: изменяемые версии, добавленные или удаленные поля и т.д.
- Может быть легко расширен – вы можете написать свои собственные плагины для определенных классов.
- Включает специальные подсказки для еще более эффективного кода: форматы строк, nullable, var len и т. Д.
- Предоставляет небольшой конечный формат для встроенных функций JVM.
- Поддержка небезопасного режима для лучшей производительности.
- Циклические ссылки любой сложности.
- Кодировка UTF-8, UTF-16 и ISO 8859-1.
- Совместим даже со сложными коллекциями, универсальными и обнуляемыми значениями.
Представление
Согласно Активному сериализатору веб-сайту , он утверждает, что является самым быстрым сериализатором на основе JVM среди существующих по результатам популярного тестового инструмента сериализатора JVM . Такая производительность Активного сериализатора является результатом хорошо продуманной архитектуры и широкого использования библиотеки Active Codegen для динамической генерации кода во время выполнения. Давайте проверим Активный сериализатор выход!
Простая сериализация Объектов
Давайте создадим сериализуемый POJO, используя @@Сериализовать
и @Десериализовать
аннотации:
public static class Person { //use @Deserialize annotation with property name in constructor public Person(@Deserialize("age") int age, @Deserialize("name") String name) { this.age = age; this.name = name; } // Use @Serialize annotation with order number on properties or their getters. // The name of the property must be the same as declared in @Deserialize annotation. // order number provides compatibility. @Serialize(order = 0) public int age; @Serialize(order = 1) public final String name; private String surname; @Serialize(order = 2) public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
Этого достаточно, чтобы сделать класс сериализуемым. Теперь давайте создадим экземпляр Person
и Двоичный сериализатор
(представляет сериализатор, который будет кодировать и декодировать значения в байтовые массивы). Поэтому нам также понадобится массив байтов для хранения результата сериализации.
Person john = new Person(34, "John"); john.setSurname("Smith"); byte[] buffer = new byte[200]; BinarySerializerserializer = SerializerBuilder.create(getSystemClassLoader()) .build(Person.class);
Чтобы кодировать и декодировать наш экземпляр, просто используйте encode
и декодировать
методы:
serializer.encode(buffer, 0, john); Person johnCopy = serializer.decode(buffer, 0);
Давайте перейдем к чему-то немного более сложному.
Сериализация обобщений и интерфейсов
Активный сериализатор позволяет работать с интерфейсами и универсальными приложениями с помощью простого DSL. Во-первых, давайте создадим Навык
класс:
public static class Skill{ private K key; private V value; public Skill(@Deserialize("key") K key, @Deserialize("value") V value) { this.key = key; this.value = value; } @Serialize(order = 0) public K getKey() { return key; } @Serialize(order = 1) public V getValue() { return value; } }
Далее мы создадим интерфейс Person
. У него будет метод, который возвращает список навыков:
public interface Person{ @Serialize(order = 0) List > getSkills(); }
Теперь нам нужно создать класс, который будет реализовывать Person
интерфейс. Пусть это будет Разработчик
:
public static class Developer implements Person{ private List > list; @Serialize(order = 0) @Override public List > getSkills() { return list; } public void setSkills(List > list) { this.list = list; } }
Теперь создайте экземпляр Разработчик
, Двоичный сериализатор<Разработчик>
и массив байтов:
Developer developer = new Developer(); developer.setSkills(Arrays.asList( new Skill<>(1, "Java"), new Skill<>(2, "ActiveSerializer"))); byte[] buffer = new byte[200]; BinarySerializerserializer = SerializerBuilder.create(getSystemClassLoader()) .build(Developer.class);
Теперь вы можете сериализовать и десериализовать Разработчик
экземпляр с методами кодирования и декодирования:
serializer.encode(buffer, 0, developer); Developer developer2 = serializer.decode(buffer, 0);
Есть какие-нибудь вопросы? Добро пожаловать в раздел комментариев!
Оригинал: “https://dev.to/activej/activeserializer-ultra-fast-java-serialization-library-582g”