将对象导入ChannelBuffer

时间:2013-01-29 20:56:35

标签: java http netty

我按照example http server编写了一个使用Netty的小型http服务器,现在我正在尝试根据我的需要调整它(一个应该发送json的小应用程序)。我首先使用jackson手动将我的POJO编码为json,然后使用StringEncoder获取ChannelBuffer。现在我试图通过添加HttpContentEncoder将POJO编码的位提取到json来略微概括它,我已经设法实现了或多或少。

我无法弄清楚的部分是如何在HttpResponse上设置内容。它需要一个ChannelBuffer,但我如何将我的对象变成ChannelBuffer?

修改

假设我有一个像下面这样的代码的处理程序,并且有一个知道如何序列化SomeSerializableObject的HttpContentEncoder。那么如何将我的内容(SomeSerializableObject)提供给HttpContentEncoder?这就是我在寻找的东西。

SomeSerializableObject obj = ...

// This won't work becuase the HttpMessage expects a ChannelBuffer
HttpRequest res = ...
res.setContent(obj);

Channel ch = ...
ch.write(res);

在进一步研究之后,虽然我不确定这是HttpContentEncoder的意图,还是做压缩之类的东西?

1 个答案:

答案 0 :(得分:3)

大多数对象序列化/反序列化库使用InputStreamOutputStream。您可以创建一个动态缓冲区(或用于反序列化的包装缓冲区),用ChannelBufferOutputStream(或ChannelBufferInputStream)包装它以提供序列化库。例如:

// Deserialization
HttpMessage m = ...;
ChannelBuffer content = m.getContent();
InputStream in = new ChannelBufferInputStream(content);
Object contentObject = myDeserializer.decode(in);

// Serialization
HttpMessage m = ...;
Object contentObject = ...;
ChannelBuffer content = ChannelBuffers.dynamicBuffer();
OutputStream out = new ChannelBufferOutputStream(content);
mySerializer.encode(contentObject, out);
m.setContent(content);

如果序列化库允许您使用字节数组而不是流,那么使用ChannelBuffer.array()ChannelBuffer.arrayOffset()可以更简单。