跳到主要内容

七、Netty 教程 – 序列化-Protobuf

作者:唐亚峰 | 出自:唐亚峰博客

> 上一章中,我们介绍了JAVA自带序列化,在java中我们如果需要序列化只需要继承Serializable接口就可以通过输入输出流进行序列化反序列化,但在提供简单调用的同时也存在很多问题,本章将会逐渐的介绍….

为了更好的掌握Netty序列化相关知识,本章使用Netty给我们提供的ObjectEncoderObjectDecoder对订单请求与应答消息进行序列化操作…

Java序列化的弱点

  • 不支持跨语言,当我们进行跨应用之间的服务调用的时候如果另外一个应用使用PHP语言来开发,这个时候我们发送过去的序列化对象,别人是无法进行反序列化的因为其内部实现对于别人来说完全就是黑盒。
  • 序列化效率低下,字节流过大,这个我们可以做一个实验,还是上一节中的OrderRequest类,我们分别用java的序列化和使用二进制编码来做一个对比

> 序列化后字节码对比

@Test
public void test1() throws IOException {
Order order = new Order(1, "Levin", "Netty Book", "130****1912", "China");
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(order);
os.flush();
System.out.println("JDK序列化后的长度: " + out.toByteArray().length);
os.close();
out.close();
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put(order.getAddress().getBytes());
buffer.put(order.getPhoneNumber().getBytes());
buffer.put(order.getUserName().getBytes());
buffer.put(order.getProductName().getBytes());
buffer.flip();
byte[] result = new byte[buffer.remaining()];
buffer.get(result);
System.out.println("使用二进制序列化的长度:" + result.length);
}