概念
序列化:将java对象转换为字节序列的过程叫做序列化
反序列化:将字节对象转换为java对象的过程叫做反序列化
要解决的问题
1.序列化时间
2.反序列化时间
3.bytes大小
4.操作方便 支持的数据类型和应用传输数据的格式是否恰当
例举几种方式序列化的方式:有一篇很好的文章http://www.iteye.com/topic/1128868
说白了就是只有编码后的包小,才能传的快,只有解码的时候效率高,才能使协议处理的效率高
选用什么的编解码协议,我觉得要本着易用,效率高为原则,
比如protobuff,优点:字节数很小,适合网络传输节省io,跨语言 。缺点:需要依赖于工具生成代码,不易用
编码可以用jprotobuff这个中间件,很方便,可解码就悲剧了,很麻烦,另外对于复杂的数据类型,也不好处理
java 自带的
优点:java原生支持,不需要提供第三方的类库,使用比较简单。缺点:无法跨语言,字节数占用比较大,某些情况下对于对象属性的变化比较敏感。
json
Json的优点:明文结构一目了然,可以跨语言,属性的增加减少对解析端影响较小。缺点:字节数过多,依赖于不同的第三方类库。
amf3 比较适合大数据传输,另外压缩比很高,适用于slg类型的后台计算,前台展示的游戏,另外Object和array于java的互转比较省事
列出我项目用到的java和amf3解码的代码
public void amf3Decode(ProtocolDecoderOutput out, byte[] bytes, boolean compressed) throws Exception { int len = bytes.length; ByteArrayInputStream bios = new ByteArrayInputStream(bytes, 0, len); Amf3Input amf3in = null; try { amf3in = new Amf3Input(context); if (compressed) { amf3in.setInputStream(new GZIPInputStream(bios)); } else { amf3in.setInputStream(bios); } Object message = amf3in.readObject(); if (message != null) { out.write(message); } } finally { if (amf3in != null) { amf3in.close(); } } } public void javaDecode(ProtocolDecoderOutput out, byte[] bytes, boolean compressed) throws Exception { int len = bytes.length; ByteArrayInputStream bios = new ByteArrayInputStream(bytes, 0, len); ObjectInputStream ois = null; try { if (compressed) { ois = new ObjectInputStream(new InflaterInputStream(bios)); } else { ois = new ObjectInputStream(bios); } Object message = ois.readObject(); if (message != null) { out.write(message); } } finally { if (ois != null) { ois.close(); } } // in.close(); }
列出我项目中java和amf3编码的代码
protected void getAmf3Bytes(IoBuffer buffer, Object message) throws Exception { Amf3Output amf3out = null; try { amf3out = new Amf3Output(context); amf3out.setOutputStream(new IoBufferOutputStream(buffer)); amf3out.writeObject(message); amf3out.flush(); } finally { if (amf3out != null) { amf3out.close(); } } } protected void getJavaBytes(IoBuffer buffer, Object message) throws Exception { ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new IoBufferOutputStream(buffer)); oos.writeObject(message); oos.flush(); } finally { if (oos != null) { oos.close(); } } }