高性能Java不同格式的序列化Chronicle Wire


Java 序列化是一种流行的机制,您可以在其中序列化和反序列化复杂的对象图,Chronicle Wire是一个开源库,最初是为了支持 Chronicle Queue 和 Chronicle Map 而编写的。但是,该库在任何使用序列化的代码中都很有用。Chronicle Wire 与原生 Java 序列化的不同之处在于它实际上支持多种不同的格式,例如二进制、YAML、JSON、原始二进制数据和 CSV。
Chronicle Wire 背后的真正创新在于您无需更改代码即可更改编码。该库将序列化的实现抽象为可插入的 Wire 实现。这个想法是您的对象只需要描述要序列化的内容,而不是应该如何序列化。这是由实现 Marshallable 接口的对象(要序列化的 POJO)完成的:“net.openhft.chronicle.wire.Marshallable”(当您使用 Java 序列化时,您在“java.io.Serializable”上添加标记接口。)
Chronicle Wire 有多种实现方式,每种实现方式都适用于不同的场景。例如,当我们想要提供应用程序配置文件或创建数据驱动的测试时,我们经常希望将对象序列化或反序列化为 YAML、JSON 等人类可读格式。还能够发送序列化为类型化 JSON 的 java 对象允许我们从应用程序的 JavaScript UI 层发送和接收消息。有时,能够在编码格式之间进行互操作很重要。
一个例子是开源产品 Chronicle Queue。Chronicle Queue 使用 Chronicle Wire 的紧凑二进制格式存储其数据。然后它读取二进制数据,然后通常以人类可读的 YAML 格式将其记录到控制台。这对于调试或合规性报告很有用。人类可读格式示例让我们看一个示例,其中 Chronicle Wire 将数据编码为简单的人类可读格式。我们使用以下 DTO:
请参阅  WireExamples1.java

package net.openhft.chronicle.wire;

import net.openhft.chronicle.core.pool.ClassAliasPool;
import static net.openhft.chronicle.bytes.Bytes.allocateElasticOnHeap;

public class WireExamples {

   public static class Car implements Marshallable {
       private int number;
       private String driver;

       public Car(String driver, int number) {
           this.driver = driver;
           this.number = number;
       }
   }

   public static void main(String... args) {

       // allows the the YAML to refer to car, rather than net.openhft.chronicle.wire.WireExamples$Car
       ClassAliasPool.CLASS_ALIASES.addAlias(Car.class);

       Wire wire = new YamlWire(allocateElasticOnHeap());
       wire.getValueOut().object(new Car("Lewis Hamilton", 44));
       System.out.println(wire);
   }
}

如果允许这段代码,输出:
!Car {
  number: 44,
  driver: Lewis Hamilton
}

改为JSON Wire:

 Wire wire = new JSONWire(allocateElasticOnHeap());

这就会输出:

{"number":44,"driver":"Lewis Hamilton"}

更多点击标题,文档: Chronicle Wire