通常我们习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。
反之,解码(Decode)称为反序列化(deserialization),它把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。
Java序列化
相信大多数Java程序员接触到的第一种序列化或者编解码技术就是Java默认提供的序列化机制,需要序列化的Java对象只需要实现java.io.Serializable接口并生成序列化ID,这个类就能够通过java.io.ObjectInput和java.io.ObjectOutput序列化和反序列化。
其他序列化框架
Java默认的序列化机制效率很低、序列化后的码流也较大,所以涌现出了非常多的优秀的Java序列化框架,例如:hessian、protobuf、thrift、protostuff、kryo、msgpack、avro、fst 等等。
扩展Netty 解码器
Netty提供了 io.netty.handler.codec.MessageToByteEncoder
和io.netty.handler.codec.ByteToMessageDecoder
接口,方便我们扩展编解码。
为了扩展序列化框架更方便,我们首先定义Serializer
接口:
import java.io.IOException;
/**
* @author Ricky Fung
*/
public interface Serializer {
byte[] encode(Object msg) throws IOException;
<T> T decode(byte[] buf, Class<T> type) throws IOException;
}
定义Serializer工厂:
import com.mindflow.netty4.serialization.hessian.HessianSerializer;
/**
* @author Ricky Fung
*/
public class SerializerFactory {
public static Serializer getSerializer(){
return new HessianSerializer();
}
}
接下来,我们在Netty Decoder中使用上面定义的Serializer接口,如下:
import com.mindflow.netty4.serialization.Serializer;
import com.mindflow.netty4.serialization.SerializerFactory;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* ${DESCRIPTION}
*
* @author Ricky Fung
*/
public class NettyMessageDecoder<T> extends LengthFieldBasedFrameDecoder {
private Logger logger = LoggerFactory.getLogger(getClass());
//判断传送客户端传送过来的数据是否按照协议传输,头部信息的大小应该是 byte+byte+int = 1+1+4 = 6
private static final int HEADER_SIZE = 6;
private Serializer serializer = SerializerFactory.getSerializer();
private Class<T> cl