对于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的更多相关文章

  1. java编解码技术,json序列化与二进制序列化

    1.何为json序列化与二进制序列化 通常我们在程序中采用的以json为传输,将json转为对象的就是json序列化了.而二进制序列化通常是我们将数据转换为二进制进行传输,然后在进行各类转换操作 2. ...

  2. Netty 源码 ChannelHandler(四)编解码技术

    Netty 源码 ChannelHandler(四)编解码技术 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.拆包与粘 ...

  3. (中级篇 NettyNIO编解码开发)第六章-编解码技术

    基于Java提供的对象输入/输出流ObjectlnputStream和ObjectOutputStream,可以直接把Java对象作为可存储的字节数组写入文件,也可以传输到网络上.对程序员来说,基于J ...

  4. Netty 编解码技术 数据通信和心跳监控案例

    Netty 编解码技术 数据通信和心跳监控案例 多台服务器之间在进行跨进程服务调用时,需要使用特定的编解码技术,对需要进行网络传输的对象做编码和解码操作,以便完成远程调用.Netty提供了完善,易扩展 ...

  5. netty权威指南学习笔记六——编解码技术之MessagePack

    编解码技术主要应用在网络传输中,将对象比如BOJO进行编解码以利于网络中进行传输.平常我们也会将编解码说成是序列化/反序列化 定义:当进行远程跨进程服务调用时,需要把被传输的java对象编码为字节数组 ...

  6. Netty编解码技术

    编解码技术,说白了就是java序列化技术,序列化目的就两个,第一进行网络传输,第二对象持久化. 虽然我们可以使用java进行对象序列化,netty去传输,但是java序列化的硬伤比较多,比如java序 ...

  7. Netty编解码技术和UDP实现

    背景 作为网络传输框架,免不了传输对象,对象在传输之前就要序列化,这个序列化的过程就是编码过程.接收到编码后的数据就需要解码,还原传输的数据. 编解码技术就是java序列化技术,序列化的目的有两个,一 ...

  8. [转帖]AVS音视频编解码技术了解

    AVS高清立体视频编码器 电视技术在经历了从黑白到彩色.从模拟到数字的技术变革之后正在酝酿另一场技术革命,从单纯观看二维场景的平面电视跨越到展现三维场景的立体电视3DTV.3DTV系统的核心问题之一是 ...

  9. 【H.264/AVC视频编解码技术具体解释】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

    <H.264/AVC视频编解码技术具体解释>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战project的形式对H.2 ...

随机推荐

  1. mysql 启动失败

    1 mysql 启动时报:MySQL Daemon failed to start.并且启动失败 2 查看mysql log日志  less /var/log/mysqld.log 3 从两行erro ...

  2. DatePicker及其监听

    xml文件: <DatePicker android:id="@+id/datep" android:layout_width="wrap_content" ...

  3. "此站点已经禁用应用程序"在sharepoint 2013中通过v2013部署app提示该错误

    该错误的原文是:the apps are disabled in this site 可以在yahoo或者bing上搜索这个错误,可以找到解决办法: msdn上也有该错误解决办法,但是如果搜索中文,目 ...

  4. Android四大组件之Activity详解——传值和获取结果

    废话不多说,先来看效果图 项目源码: http://download.csdn.net/detail/ginodung/8331535 程序说明: 在MainActivity中输入用户名和密码,然后提 ...

  5. Hibernate正向工程(实体类-->数据库)

    1,新建实体类News.java package com.hanqi.dao; import java.util.Date; public class News { private Integer i ...

  6. 【POJ 3243】Clever Y 拓展BSGS

    调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...

  7. linux-查看系统是32位还是64位

    可以用命令“getconf LONG_BIT”查看, 如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看, 输出的结果中,如果有x86_6 ...

  8. 详解Mac配置虚拟环境Virtualenv

    virtualenv 可以用来建立一个专属于项目的python环境,保持一个干净的环境.只需要通过命令创建一个虚拟环境,不用的时候通过命令退出,删除. 下面介绍一下安装方法: 安装 virtualen ...

  9. htm.dropdownlist

    @Html.DropDownList("status", new SelectList(new[] { "驳回", "确认", " ...

  10. 浅谈malloc()与free()

    malloc()与free() l  函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...