序列化后的消息有效负载大于应有的数量

时间:2019-02-05 22:09:43

标签: spring-integration

摘要

我正在尝试通过我的Spring Integration应用程序代理TCP流通信。我有一个测试有效载荷,它是一个字节数组,总共长291个字节。前两个字节是十六进制的长度标头,其余289个字节是数据本身。

最初,我和ByteArrayLengthHeaderSerializer一起使用的是标题值为2的TcpNetServerConnectionFactory

连接到我的TcpReceivingChannelAdapter的{​​{1}}接收到该消息。它将直接放在TcpNetServerConnectionFactory的通道上,该通道接收ServiceActivator对象作为参数。

在该方法中,我使用Message检索有效负载,然后将message.getPayload()交给Object以返回字节数组。当我打印SerializationUtils.serialize()时,它是316,而不是289。

为什么有效载荷更大?我不明白这些多余的字节是什么,我无法在上游代理它,因为现在格式不正确。

背景

我的第一个想法是2字节标头的格式不正确,无法与array.length一起使用。因此,可以肯定的是,我扩展了该类并自己实现了ByteArrayLengthHeaderSerializer。如您所见,我将长度打印到readHeader()上,并且可以正常工作-我得到289。

但是,当我在Service Activator中转换/打印有效负载大小时,有效负载大小仍大于300。在序列化程序和Service Activator之间没有其他消息传递端点,因此我也不明白这些额外的地方字节来自。

在这种情况下,System.err可能工作正常,因为即使在到达服务激活器之前我已经确认长度为289,我仍然遇到此问题。

无论我使用哪种序列化程序,有效载荷的大小如何增加?

代码

自定义ByteArrayLengthHeaderSerializer

ByteArrayLengthHeaderSerializer

服务激活器方法

@Override
protected int readHeader(InputStream inputStream) throws IOException {
    byte[] lengthPart = new byte[2];

    if (inputStream.read(lengthPart, 0, 2) != 2) {
        throw new IOException();
    }

    int length = ByteBuffer.wrap(lengthPart).getShort();

    System.err.println(length);

    return length;
}

集成组件

public Message editRequest(Message message) {
    byte[] payload = SerializationUtils.serialize(message.getPayload());

    System.err.println("payload length: " + payload.length);

    return message;
}

1 个答案:

答案 0 :(得分:1)

  

,然后将该对象传递给SerializationUtils.serialize()以返回字节数组

  

byte[] payload = SerializationUtils.serialize(message.getPayload());

根本不需要这样做;有效负载已经是byte[](由长度标头序列化程序创建)。

当然,将序列化应用于现有的byte[]最终会变得更大,因为它会添加元数据(幻数,类型信息等)。

只需将服务更改为

public Message editRequest(Message<byte[]> message) {
    byte[] payload = message.getPayload();
    ...
}