对于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序列化作为远程跨借点调用的编码框架,那如何了,在研究一下了呗.
天天学习,天天进步......学以致用