此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

Codec

Spring Integration 的 4.2 版引入了Codec抽象化。 编解码器对对象进行编码和解码byte[]. 它们提供了 Java 序列化的替代方案。 一个优点是,通常,对象不需要实现Serializable. 我们提供了一种使用 Kryo 进行序列化的实现,但您可以提供自己的实现以用于以下任何组件:spring-doc.cadn.net.cn

EncodingPayloadTransformer

此转换器将有效负载编码为byte[]通过使用编解码器。 它不会影响邮件头。spring-doc.cadn.net.cn

有关更多信息,请参阅 Javadocspring-doc.cadn.net.cn

DecodingTransformer

该转换器解码byte[]通过使用编解码器。 它需要配置Class对象应解码到的表达式(或解析为Class). 如果生成的对象是Message<?>,则不会保留入站标头。spring-doc.cadn.net.cn

有关更多信息,请参阅 Javadocspring-doc.cadn.net.cn

CodecMessageConverter

某些端点(例如 TCP 和 Redis)没有消息头的概念。 他们支持使用MessageConverterCodecMessageConverter可用于将消息转换为byte[]用于传输。spring-doc.cadn.net.cn

有关更多信息,请参阅 Javadocspring-doc.cadn.net.cn

克里奥

目前,这是唯一的实现Codec,它提供了两种Codec:spring-doc.cadn.net.cn

该框架提供了几个自定义序列化程序:spring-doc.cadn.net.cn

第一个可以与PojoCodec通过使用FileKryoRegistrar. 第二个和第三个与MessageCodec,它使用MessageKryoRegistrar.spring-doc.cadn.net.cn

自定义 Kryo

默认情况下,Kryo 将未知的 Java 类型委托给其FieldSerializer. Kryo 还为每个基元类型注册默认序列化器,以及String,CollectionMap.FieldSerializer使用反射来导航对象图表。 一种更有效的方法是实现一个自定义序列化器,该序列化器知道对象的结构,并且可以直接序列化选定的基元字段。 以下示例显示了这样的序列化程序:spring-doc.cadn.net.cn

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());
    }
}

Serializer接口公开Kryo,InputOutput,提供对包含哪些字段和其他内部设置的完全控制,如 Kryo 文档中所述。spring-doc.cadn.net.cn

注册自定义序列化程序时,需要注册 ID。 注册 ID 是任意的。 但是,在我们的例子中,必须显式定义 ID,因为分布式应用程序中的每个 Kryo 实例都必须使用相同的 ID。 Kryo 推荐小的正整数并保留几个 id(值< 10)。 Spring Integration 目前默认使用 40、41 和 42(对于前面提到的文件和消息头序列化程序)。 我们建议您从 60 开始,以便在框架中进行扩展。 您可以通过配置前面提到的注册商来覆盖这些框架默认值。

使用自定义 Kryo 序列化器

如果您需要自定义序列化,请参阅 Kryo 文档,因为您需要使用本机 API 来进行自定义。 有关示例,请参阅org.springframework.integration.codec.kryo.MessageCodec实现。spring-doc.cadn.net.cn

实现 KryoSerializable

如果您有write访问域对象源代码,您可以实现KryoSerializable如此所述。 在这种情况下,类本身提供序列化方法,不需要进一步配置。 但是,基准测试表明,这不如显式注册自定义序列化程序那么有效。 以下示例显示了一个自定义的 Kryo 序列化器:spring-doc.cadn.net.cn

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 以外的序列化库。spring-doc.cadn.net.cn

使用@DefaultSerializer注解

Kryo 还提供了一个@DefaultSerializer注释,如此处所述。spring-doc.cadn.net.cn

@DefaultSerializer(SomeClassSerializer.class)
public class SomeClass {
       // ...
}

如果您有write访问域对象,这可能是指定自定义序列化程序的更简单方法。 请注意,这不会向 ID 注册类,这可能会使该技术在某些情况下无济于事。spring-doc.cadn.net.cn