我按照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的意图,还是做压缩之类的东西?
答案 0 :(得分:3)
大多数对象序列化/反序列化库使用InputStream
和OutputStream
。您可以创建一个动态缓冲区(或用于反序列化的包装缓冲区),用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()
可以更简单。