zoukankan      html  css  js  c++  java
  • 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序列化作为远程跨借点调用的编码框架,那如何了,在研究一下了呗.

  • 相关阅读:
    apply 和 call 方法详解【转载】
    npm无法安装node-sass的解决方法
    rem
    创建和存储 cookie
    webpack学习(一):webpack的安装和命令行
    gulp常用的插件
    移动前端开发之viewport的深入理解
    JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
    JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
    JavaSE中Collection集合框架学习笔记(1)——具有索引的List
  • 原文地址:https://www.cnblogs.com/kabi/p/6115101.html
Copyright © 2011-2022 走看看