此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
Spring Integration 的 4.2 版引入了抽象。
编解码器对对象进行编码和解码。
它们提供了 Java 序列化的替代方法。
一个优点是,通常,对象不需要实现 。
我们提供了一个使用 Kryo 进行序列化的实现,但您可以提供自己的实现以用于以下任何组件:Codec
byte[]
Serializable
-
EncodingPayloadTransformer
-
DecodingTransformer
-
CodecMessageConverter
EncodingPayloadTransformer
此转换器使用编解码器将有效负载编码为 a。
它不会影响邮件头。byte[]
有关更多信息,请参见 Javadoc。
DecodingTransformer
此转换器使用编解码器解码 a。
它需要配置对象应解码到的 (或解析为 的表达式)。
如果生成的对象是 ,则不会保留入站标头。byte[]
Class
Class
Message<?>
有关更多信息,请参见 Javadoc。
CodecMessageConverter
某些端点(如 TCP 和 Redis)没有消息标头的概念。
它们支持使用 ,并且 可用于将消息与 a 相互转换或从 a 进行传输。MessageConverter
CodecMessageConverter
byte[]
有关更多信息,请参见 Javadoc。
克里奥
目前,这是 的唯一实现,它提供了两种:Codec
Codec
-
PojoCodec
:用于变压器 -
MessageCodec
:用于CodecMessageConverter
该框架提供了几个自定义序列化程序:
-
FileSerializer
-
MessageHeadersSerializer
-
MutableMessageHeadersSerializer
第一个可以通过使用 初始化 来与 一起使用。
第二个和第三个与 一起使用,后者使用 初始化。PojoCodec
FileKryoRegistrar
MessageCodec
MessageKryoRegistrar
自定义 Kryo
缺省情况下,Kryo 将未知的 Java 类型委托给其 .
Kryo 还为每个基元类型注册默认序列化程序,以及 、 和 。 使用反射来导航对象图。
更有效的方法是实现一个自定义序列化程序,该序列化程序可以识别对象的结构,并且可以直接序列化选定的基元字段。
以下示例演示了此类序列化程序:FieldSerializer
String
Collection
Map
FieldSerializer
public class AddressSerializer extends Serializer<Address> {
@Override
public void write(Kryo kryo, Output output, Address address) {
output.writeString(address.getStreet());
output.writeString(address.getCity());
output.writeString(address.getCountry());
}
@Override
public Address read(Kryo kryo, Input input, Class<Address> type) {
return new Address(input.readString(), input.readString(), input.readString());
}
}
该接口公开了 、 和 ,它们提供了对包含哪些字段和其他内部设置的完全控制,如 Kryo 文档中所述。Serializer
Kryo
Input
Output
注册自定义序列化程序时,需要注册 ID。 注册 ID 是任意的。 但是,在我们的例子中,必须显式定义 ID,因为分布式应用程序中的每个 Kryo 实例都必须使用相同的 ID。 Kryo 建议使用小正整数并保留一些 ID(值< 10)。 Spring Integration 目前默认使用 40、41 和 42(用于前面提到的文件和消息标头序列化程序)。 我们建议您从 60 开始,以便在框架中进行扩展。 您可以通过配置前面提到的注册商来覆盖这些框架默认值。 |
使用自定义 Kryo 序列化程序
如果需要自定义序列化,请参阅 Kryo 文档,因为需要使用本机 API 进行自定义。
有关示例,请参阅实现。org.springframework.integration.codec.kryo.MessageCodec
实现 KryoSerializable
如果您有权访问域对象源代码,则可以按此处所述实现。
在这种情况下,类本身提供序列化方法,不需要进一步的配置。
但是,基准测试表明,这不如显式注册自定义序列化程序有效。
以下示例显示了自定义 Kryo 序列化程序:write
KryoSerializable
public class Address implements KryoSerializable {
@Override
public void write(Kryo kryo, Output output) {
output.writeString(this.street);
output.writeString(this.city);
output.writeString(this.country);
}
@Override
public void read(Kryo kryo, Input input) {
this.street = input.readString();
this.city = input.readString();
this.country = input.readString();
}
}
您还可以使用此技术来包装 Kryo 以外的序列化库。
使用注释@DefaultSerializer
Kryo 还提供了一个注释,如此处所述。@DefaultSerializer
@DefaultSerializer(SomeClassSerializer.class)
public class SomeClass {
// ...
}
如果您有权访问域对象,则这可能是指定自定义序列化程序的更简单方法。
请注意,这不会使用 ID 注册类,这可能会使该技术在某些情况下无济于事。write
注册自定义序列化程序时,需要注册 ID。 注册 ID 是任意的。 但是,在我们的例子中,必须显式定义 ID,因为分布式应用程序中的每个 Kryo 实例都必须使用相同的 ID。 Kryo 建议使用小正整数并保留一些 ID(值< 10)。 Spring Integration 目前默认使用 40、41 和 42(用于前面提到的文件和消息标头序列化程序)。 我们建议您从 60 开始,以便在框架中进行扩展。 您可以通过配置前面提到的注册商来覆盖这些框架默认值。 |