java编解码技术,netty nio

Posted 全力以赴001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编解码技术,netty nio相关的知识,希望对你有一定的参考价值。

对于java提供的对象输入输出流ObjectInputStream与ObjectOutputStream,可以直接把java对象作为可存储的字节数组写入文件,也可以传输到网络上去。对与java开放人员来说,默认的jdk序列化机制可以避免操作底层的字节数组,从而提升开发效率。

1.为什么需要序列化

网络传输与对象序列化

 

2.java编解码技术指的什么

netty nio是基于网络传输,当进行远程跨进程服务调用时,需要把被传输的对象编码为字节数组或者bytebuffer对象。而当远程服务读取到bytebuffer对象或字节数组时,需要将其解码发送时候的java对象。这个就是java对象的编解码技术。

 

3.java原生态序列化的缺点

(1)无法跨语言,这个是最致命的问题。当跨进程服务调用,其余语言,如与c++交互时,java序列化难以胜任。java序列化用的是java内部私有协议

(2)序列化后码流太大

如:

 1 package com.ming.netty.code;
 2 
 3 import java.io.Serializable;
 4 import java.nio.ByteBuffer;
 5 
 6 
 7 /**
 8  * 一个普通学生类
 9  * @author mingge
10  *
11  */
12 public class Student implements Serializable{
13     private static final long serialVersionUID = 1L;
14 
15     private String stuName;
16 
17 
18     public String getStuName() {
19         return stuName;
20     }
21 
22     public void setStuName(String stuName) {
23         this.stuName = stuName;
24     }
25     
26     public byte[] codeC(){
27         ByteBuffer buffer=ByteBuffer.allocate(1024);
28         byte[] value=this.getStuName().getBytes();
29         buffer.putInt(value.length);
30         buffer.put(value);
31         buffer.flip();
32         value=null;
33         byte[] result=new byte[buffer.remaining()];
34         buffer.get(result);
35         return result;
36     }
37     
38 }
 1 package com.ming.netty.code;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectOutputStream;
 6 
 7 public class TestStudent {
 8 
 9     public static void main(String[] args) throws IOException {
10         Student s=new Student();
11         s.setStuName("张三");
12         ByteArrayOutputStream bos=new ByteArrayOutputStream();
13         ObjectOutputStream os=new ObjectOutputStream(bos);
14         os.writeObject(s);
15         os.flush();
16         os.close();
17         byte[] b=bos.toByteArray();
18         System.out.println("jdk序列化长度:"+b.length);
19         bos.close();
20         System.out.println("二进制序列化长度:"+s.codeC().length);
21     }
22 }

先建立一个名叫Student的普通类并序列化,然后test一下。

结果如下:

jdk序列化长度:88
二进制序列化长度:8

 

结论就是序列化性能比二进制编码还低下。网络传输占用了数据量,会影响整个程序的吞吐量的,这显而易见了。

 

显然我们通常不会选择java序列化作为远程跨借点调用的编码框架,那如何了,在研究一下了呗.

 

 

 

天天学习,天天进步......学以致用

 

以上是关于java编解码技术,netty nio的主要内容,如果未能解决你的问题,请参考以下文章

Netty你会了吗?

Netty系列之Netty高性能之道

Netty 系列之 Netty 高性能之道

实战Netty系列之Netty高性能之道

Netty4自带编解码器详解

Netty系列之Netty高性能之道