See the topic, some students may think, last said the object passed it? Yes, just in the Java NIO Framework Netty Tutorial (eight) The object object is passed, we just show how to use the Netty provided by the codec/Decode tool to complete the serialization of objects. This is to tell you netty specifically how to do, perhaps some students want to complete the serialization of their own? Moreover, the serialization of objects is available everywhere:)
First look at how to encode.
View Sourceprint?
01.
@Override
02.
protected
Object encode(ChannelHandlerContext ctx, Channel channel, Object msg)
throws
Exception {
03.
ChannelBufferOutputStream bout =
04.
new
ChannelBufferOutputStream(dynamicBuffer(
05.
estimatedLength, ctx.getChannel().getConfig().getBufferFactory()));
06.
bout.write(LENGTH_PLACEHOLDER);
07.
ObjectOutputStream oout =
new
CompactObjectOutputStream(bout);
08.
oout.writeObject(msg);
09.
oout.flush();
10.
oout.close();
11.
12.
ChannelBuffer encoded = bout.buffer();
13.
encoded.setInt(
0
, encoded.writerIndex() -
4
);
14.
return
encoded;
15.
}
In fact, you should have thought of, in Java in the serialization of the object is naturally not objectoutputstream. Netty This is just another layer of packaging that adds a 4-byte flag to the beginning of the stream. Therefore, Netty declares that the encoding and decoding classes must be used in a complementary, incompatible with the simple objectintputstream.
* An encoder which serializes a Java object into a {@link channelbuffer}.
* <p>
* Please note that the serialized form this encoder produces are not
* Compatible with the standard {@link ObjectInputStream}. Please use
* {@link Objectdecoder} or {@link Objectdecoderinputstream} to ensure the
* Interoperability with this encoder.
Decoding nature is to parse out the extra 4 bits first and then parse through ObjectInputStream.
The details about the serialization of Java objects are beyond the scope of the text discussion, but I wonder if you're interested in trying to write one yourself? So-called, more hands-on.
View Sourceprint?
01.
/**
02.
* Object编码类
03.
*
04.
* @author lihzh
05.
* @alia OneCoder
06.
* @blog http://www.it165.net
07.
*/
08.
public
class
MyObjEncoder
implements
ChannelDownstreamHandler {
09.
10.
@Override
11.
public
void
handleDownstream(ChannelHandlerContext ctx, ChannelEvent e)
12.
throws
Exception {
13.
// 处理收发信息的情形
14.
if
(e
instanceof
MessageEvent) {
15.
MessageEvent mEvent = (MessageEvent) e;
16.
Object obj = mEvent.getMessage();
17.
if
(!(obj
instanceof
Command)) {
18.
ctx.sendDownstream(e);
19.
return
;
20.
}
21.
ByteArrayOutputStream out =
new
ByteArrayOutputStream();
22.
ObjectOutputStream oos =
new
ObjectOutputStream(out);
23.
oos.writeObject(obj);
24.
oos.flush();
25.
oos.close();
26.
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
27.
buffer.writeBytes(out.toByteArray());
28.
e.getChannel().write(buffer);
29.
}
else
{
30.
// 其他事件,自动流转。比如,bind,connected
31.
ctx.sendDownstream(e);
32.
}
33.
}
34.
}
35.
/**
36.
* Object解码类
37.
*
38.
* @author lihzh
39.
* @alia OneCoder
40.
* @blog http://www.it165.net
41.
*/
42.
public
class
MyObjDecoder
implements
ChannelUpstreamHandler {
43.
44.
@Override
45.
public
void
handleUpstream(ChannelHandlerContext ctx, ChannelEvent e)
46.
throws
Exception {
47.
if
(e
instanceof
MessageEvent) {
48.
MessageEvent mEvent = (MessageEvent) e;
49.
if
(!(mEvent.getMessage()
instanceof
ChannelBuffer)) {
50.
ctx.sendUpstream(mEvent);
51.
return
;
52.
}
53.
ChannelBuffer buffer = (ChannelBuffer) mEvent.getMessage();
54.
ByteArrayInputStream input =
new
ByteArrayInputStream(buffer.array());
55.
ObjectInputStream ois =
new
ObjectInputStream(input);
56.
Object obj = ois.readObject();
57.
Channels.fireMessageReceived(e.getChannel(), obj);
58.
}
59.
}
60.
}
How, is it easy to use? The so-called imitation, to apply.
However, to remind you that this implementation has a lot of hard-coded things, do not imitate, just to show the object, codec processing and application in Netty.
Java NIO Framework Netty Tutorial (ix) Object object encoding/decoding