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

banq發表於2022-01-23

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

 

相關文章