当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Java学习杂谈(四)[Java编程]

赞助商链接



  本文“Java学习杂谈(四)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1.关于序列化和反序列化

应当大家都大约知道Java中序列化和反序列化的意思,序列化就是把一个Java对象转换成二进制举行磁盘上传输大概网络流的传输,反序列化的意思就是把这个承遭到的二进制流重新组装成本来的对象逆历程.它们在Java中辨别是通过ObjectInputStream和  ObjectInputStream这两个类来实现的(以下辨别用ois和oos来简称).

oos的writeObject()办法用来履行序列化的历程,ois的readObject()用来履行反序列化的历程,在传输二进制流之前,需求讲这两个高层流对象衔接到同一个Channel上,这个Channel可以是磁盘文件,也可以是socket底层流.所以无论用哪类方法,底层流对象都是以构造函数参数的情势传送进oos和ois这两个高层流,衔接完毕了才可以举行二进制数据传输的.例子:

可以是文件畅通道

file = new File(“C:/data.dat”);

oos = new ObjectOutputStream(new  FileOutputStream(file));

ois = new ObjectInputStream(new  FileInputStream(file));

大概网络畅通道

oos = new ObjectOutputStream(socket.getOutputStream());

ois = new ObjectInputStream(socket.getInputStream());

不知道大家能否注意到oos老是在ois之前定义,这里不但愿大家曲解这个次序是固定的么?答复能否定的,那么有次序要求么?答复是必定的.原则是什么呢?

原则是彼此对接的输入/输出流之间必须是output流先初始化然后再input流初始化,不然就会抛非常.大家必定会问为什么?只要略微看一看这两个类的源代码文件就大约知道了,output流的任务很简单,只要把对象转换成二进制往通道中写便可以了,但input流需求做很多预备工作来承受并终究重组这个Object,所以ObjectInputStream的构造函数中就需求用到output初始化发送过来的header信息,这个办法叫做readStreamHeader(),它将会去读两个Short值用于决意用多大的缓存来存放通道发送过来的二进制流,这个缓存的size因jre的版本差别是不一样的.所以output假如不先初始化,input的构造函数首先就无法精确运行.

关于上面两个例子,第一个次序是严峻的,第二个因为oos和ois衔接的已经不是对方了,而是socket别的一端的流,需求严峻按照别的一方对接的output流先于对接的input流翻开才能顺利运行.

这个writeObject和readObject本身就是线程安全的,传输历程中是不答应被并发拜候的.所以对象能一个一个接连不断的传过来,有很多人在运行的时刻会碰到EOFException,然后百思不得其解,去各种论坛问办理筹划.其实笔者这里想说,这个非常不是必须声明的,也就是说它固然是非常,但其实是正常运行完毕的标志.EOF表示读到了文件尾,发送完毕自然衔接也就断开了.假如这影响到了你程序的精确性的话,请各位静下心来看看自己程序的业务逻辑,而不要把注意力狭隘的堆积在发送和承受的办法上.因为笔者也被这样的bug困扰了1成天,被很多论坛的帖子曲解了很多次最后得出的教导.假如在while循环中去readObject,本质上是没有问题的,有对象数据来就会读,没有就自动阻塞.那么抛出EOFException一定是因为衔接断了还在持续read,什么缘由招致衔接断了呢?一定是业务逻辑那边存在错误,比方NullPoint、ClassCaseException、ArrayOutofBound,即便程序较大也不要紧,最多只要单步伐适一次就可以很快发现bug并且办理它.

难怪一位程序大师说过:办理问题90%靠经验,5%靠技术,剩下5%靠运气!真是金玉良言,笔者大约查阅过不下30篇谈论在while循环中利用  readObject抛出EOFExceptionde  的帖子,大家都盲目的去关注注释这个名词、反序列化的行为或反对这样写而没有一个人认为EOF是精确的行为,它其实很诚恳的在做它的事情.为什么大家都忽视了真正出错误的地方呢?两个字,经验!


  以上是“Java学习杂谈(四)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .