我已经按照example http server使用Netty编写了一个小型http服务器,现在我正在尝试使其适应我的需要(一个应该发送json的小型应用程序)。我首先使用jackson将POJO手动编码为json,然后使用StringEncoder获取ChannelBuffer。现在,我尝试通过添加HttpContentEncoder提取将POJO编码为json的位来对其进行一些概括,而我设法或多或少地实现了这一点。
我不知道的部分是如何在HttpResponse上设置内容。它期望一个ChannelBuffer,但如何将对象放入ChannelBuffer?
编辑
说我有一个如下代码的处理程序,并有一个HttpContentEncoder,它知道如何序列化SomeSerializableObject。然后,如何将我的内容(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的意思,还是做压缩之类的事情?
最佳答案
大多数对象序列化/反序列化库使用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()
可能会更简单。