5.2. 使用 ProtoStream 的 Marshalling User Types
用户类型为 Data Grid 不支持的 Java 对象。要进行 marshall 用户类型,您可以实施 SerializationContextInitializer 接口来描述 Java 对象,以便 ProtoStream 库可以对其进行编码,而 Data Grid 可以传输和存储它们。
5.2.1. 生成 Serialization Context Initializers 复制链接链接已复制到粘贴板!
ProtoStream SerializationContext 包含自定义 Java 对象的 Protobuf 类型定义,从 Protobuf 模式加载,以及这些对象的附带的 marshallers。
Data Grid 提供了一个 protostream-processor 工件,可在编译时处理您的类中的 Java 注解。处理器生成 Protobuf 模式、marshallers 和 SerializationContext 接口的具体实施,您可以使用它来初始化 ProtoStream SerializationContext。
默认情况下,实施名称是注解的类名称,带有 "Impl" 后缀。
流程
将
protostream-processor依赖项添加到pom.xml中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
@ProtoField和@ProtoFactory注解您要 marshall 的 Java 对象。Author.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Book.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 定义扩展
SerializationContextInitializer的接口,并使用@AutoProtoSchemaBuilder标注。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
将 SerializationContextInitializer 实现添加到 Data Grid 配置中以注册它。
5.2.2. 手动实施 Serialization Context Initializers 复制链接链接已复制到粘贴板!
在某些情况下,您可能需要手动定义 Protobuf 模式,并实现 ProtoStream marshallers。例如,如果无法修改 Java 对象类来添加注解。
流程
创建一个 Protobuf 模式
.proto文件,为 marshall 提供 Java 对象的结构化表示。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的
.library.proto文件定义了名为 Book 的实体(Protobuf 消息类型),该实体包含在 book_sample 软件包中。本书 声明了原语类型的多个字段以及名为 author 的数组(Protobuf 可重复字段),即 Author 消息类型。- 您可以嵌套消息,但生成的结构严格是一个树,而不是图形。
- 类型继承是不可能的。
- 不支持集合,但您可以使用重复字段模拟数组。
使用
org.infinispan.protostream.MessageMarshaller接口为您的类实施 marshallers。注意MessageMarshaller接口现已弃用。下一个版本的 Data Grid 提供了一种替代的实现,可让您创建一个 adaptor 类,该类将
@ProtoAdaptor注释用于任何外部的第三方 Java 对象类。BookMarshaller.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow AuthorMarshaller.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个
SerializationContextInitializer实现,它使用SerializationContext注册.proto模式和 ProtoStream marshaller 实现。ManualSerializationContextInitializer.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
后续步骤
将 SerializationContextInitializer 实现添加到 Data Grid 配置中以注册它。
5.2.3. 注册 Serialization Context Initializers 复制链接链接已复制到粘贴板!
在 Data Grid 配置中声明 SerializationContextInitializer 实现来注册它们。
流程
-
手动以编程方式或声明性注册
SerializationContextInitializer实现,如下例所示:
编程配置
GlobalConfigurationBuilder builder = new GlobalConfigurationBuilder();
builder.serialization()
.addContextInitializers(new LibraryInitializerImpl(), new SCIImpl());
GlobalConfigurationBuilder builder = new GlobalConfigurationBuilder();
builder.serialization()
.addContextInitializers(new LibraryInitializerImpl(), new SCIImpl());
声明性配置
<serialization>
<context-initializer class="org.infinispan.example.LibraryInitializerImpl"/>
<context-initializer class="org.infinispan.example.another.SCIImpl"/>
</serialization>
<serialization>
<context-initializer class="org.infinispan.example.LibraryInitializerImpl"/>
<context-initializer class="org.infinispan.example.another.SCIImpl"/>
</serialization>