如果在 Spring XD 流中从一个“过滤器”传递到下一个“过滤器”的消息有效负载是自定义 Java 类实例,我想如果中间的“管道”是远程传输,则需要某种序列化机制。
- 对于这种情况,Spring XD 中提供了什么样的“序列化”/“转换”?
- Java 序列化是否适用于这种情况?而如果自定义类是可序列化的,Spring XD会自动对对象进行序列化/反序列化,还是我们还需要在流定义/模块定义中给出一些提示呢?
谢谢,西蒙
如果在 Spring XD 流中从一个“过滤器”传递到下一个“过滤器”的消息有效负载是自定义 Java 类实例,我想如果中间的“管道”是远程传输,则需要某种序列化机制。
谢谢,西蒙
XD 使用带有远程传输的 Kryo 序列化。Java.io.serialization 理论上可以工作,但是我们不想假设有效负载类型实现了 java.io.Serializable。此外,如果有效负载是可序列化的,我个人认为自动选择 Java 序列化而不是 Kryo 没有任何优势。通过 Spring XD 的类型转换支持 Java 序列化。
您应该能够创建一个包含以下内容的流:
filter1 --outputType=--application/x-java-serialized-object | filter2 --input-type=my.custom.SerializablePayloadType
在这种情况下,类型转换将在传输之前使用 Java 序列化。消息总线将检测到负载是一个字节数组,并将其直接发送到下一个模块。包含字节的消息会将 content-type 标头设置为声明的 outputType,以便入站转换器可以使用 Java 序列化对其进行反序列化。
以上要求payload实现Serializable。此外,自定义有效负载类型必须包含在 Spring XD 的类路径中,即,在每个已安装容器的 xd/lib 中添加一个 jar。