Java序列化与对象流浅谈

今晚又重新回顾了Java中序列化与对象流的知识,接触了一位有着上亿行有效代码量的大佬之思想,2333。

1.序列化与反序列化

Java中的序列化简而言之就是为了避免要重复使用的实例在每次执行程序过程中都要重新申请堆空间,序列化后直接加载,节约时间。序列化过程中,保存在文件中的对象只记录了对象的状态(属性),包括成员和类类型(名称),而不会存储对象的方法。可看做将一个有着灵魂的人进行灵魂转移,转移的只是他的记忆,他自己的各种行为,比如吃饭、睡觉……,每个人都拥有,且行为表现一样,即只需转移(保存)的他的记忆(属性)。贴一段代码:

首先定义一个Person对象:

package stu.xyq.Demoview;

import java.io.Serializable;

public class Person implements Serializable{
    /**
     *
     */
    private static final long serialVersionUID = 6699310621433039735L;
    private String name;
    private String sex;
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Person() {
    }
}
/*这里实现接口Serializable,产生序列号。
 *实例化该对象,并将其存入Obj.obj文件中,完成实例化: */
 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("F:\\JavaSE_App\\workplace2\\Swing复习\\src\\stu\\xyq\\Obj.obj")));//创建一个文件输出流,并将指定抽象文件以参数在实例化时传入
         Person me = new Person();
         me.setId("01151028");
         me.setName("徐徐徐");
         me.setSex("男");
         out.writeObject(me);
    out.close();

反序列化化过程如下。读取保存的对象的类型(名称)、属性,程序运行中新new()出一个Obj的实例,再将读取到的数据塞入新实例中。步骤和以上程序对偶。

序列化、反序列化用到的机理为:Java中的对象全是二进制字节数据。

2.对象流

Java中各种以stream为结尾的对象均为字节流。学习对象流之前首先要记住四点:InputStream为字节输入流的抽象父类、OutputStream为字节输出流的抽象父类、所有的输出流构造器中的参数指的是“目的地”,实例的对象调用的write()方法中的参数为数据源、所有的输入流构造器中的参数指的是“数据源”,实例的对象调用的read()方法中的参数为目的地。贴段代码实验一下,实践是检验真理的唯一标准~:

public static void systemIn() throws IOException{
        DataInputStream ois = new DataInputStream(System.in);
        BufferedInputStream bis = new BufferedInputStream(ois);

        while(!"QUIT".equals(ois.readLine())){
            String tmp = ois.readLine();
            System.out.println(tmp);
        }
    }
}

这里要注意输入输出流提供了两种读取方法readByte()与readLine(),区分它们的逻辑关系,一个是按一个一个字符读(回车也是一个字符!),一个是按行读。

对象流规律总结如下:


构造器参数


方法参数


特殊方法


数据源(File)


目的地(byte[])


FileInputStream


从File中读


读入此byte[]


ByteArrayInputStream


从byte[]中读



ObjectInputStream


InputStream


任意流


readObject()最外层,不被包装。


BufferedInputStream


InputStream


任意流


DataInputStream


InputStream


任意流

 

That‘s all.欢迎各位的宝贵意见。

时间: 2024-10-21 21:03:16

Java序列化与对象流浅谈的相关文章

java序列化与反序列化以及浅谈一下hadoop的序列化

1.什么是序列化和反序列化 神马是序列化呢,序列化就是把内存中的对象的状态信息,转换成字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什么信息,这些字节序列就是垃圾). 反序列化就是将收到字节序列或者是硬盘的持久化数据,转换成内存中的对象. 2.JDK的序列化 JDK的序列化只有实现了serializable接口就能实现序列化与反序列化,但是记得一定要加上序列化版本ID serialVersionUID 这个是识别序列化的之前那

io流浅谈

IO流浅谈 在这篇文章里,我会分别和大家聊字节流和字符流 一字节流 File     File:文件和目录(文件夹)路径名的抽象表示形式.       File的构造方法:    File(String pathname):把一个路径名称封装成File对象    File(String parent, String child):把一个父路径和一个子路径封装成一个File对象    File(File parent, String child):把一个父路径File对象和一个子路径封装成一个Fi

对kotlin和java中的synchronized的浅谈

synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12345678910111213 public class { public void () { for (int i = 0; i < 10; i ++) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStac

java基础入门-对象流与序列化

概念 对象序列化:将对象输入到流里面,并在之后将其读回. 注意事项 对象需要实现Serializable接口,Serializable接口没有任何方法,不需要重写 由于对象可能会重复使用,对象暂用不再是原来的内存地址,因此,序列化过程中引入序列号这个东西,如下图 序列化用途 对象通过序列化,然后在网络中传输,不同的机器负责不同的计算部分,从而实现分布式计算,提高计算的效率 版权声明:本文为博主原创文章,未经博主允许不得转载.

一个两年Java的面试总结,浅谈自己的面试经验

前言16年毕业到现在也近两年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易. 但是要特别感谢点我达的领导及HR,真的非常非常好,很感谢他们一直的关照和指导 面试整体事项1.简历要准备好,联系方式一定要正确清晰醒目,项目经历按照时间倒序阐述,注意描述自己在项目中承担的职责,简历的模板尽量选择简洁的,毕竟程序员大部分还是喜欢简单明了的.2.推荐boss直聘,我觉得很好用(不是广告)

为什么这些java接口没有抽象方法?浅谈Java标记接口

在jdk的源码中,存在这样的一些接口,他们不包含任何的(抽象)方法,但是却广泛的存在. 这种接口我们称之为Mark Interface,也就是标记接口. 这些接口呢,我们不用来实现任何的方法,他们的作用就是当某个类实现这个接口的时候,我们就认为这个类拥有了这个接口标记的某种功能了. 下面通过三个例子,分别介绍java中常用的三个标记接口: RandomAccess .Cloneable.java.io.Serializable (1)RandomAccess  在C#中经常会有很多人在争论,在遍

Java中Integer和String浅谈

http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本数据类型创建的对象,如 int x = 0;这里的x只有值这个属性,没有(或者很少)有其他的方法.这在一些需要对数据进行操作时变的很不方便,程序员需要自己编写很多代码去实现一些常用的功能,增加了工作量及程序的大

使用序列化和对象流实现对象的序列化

1 目标对象的类要实现 Serializable 接口  其成员若是引用类型 也必须实现Serializable 接口  若某个成员不需要序列化 transient 2 这个类可以实现复杂对象图的深度复制 1 import java.io.ByteArrayInputStream; 2 import java.io.ByteArrayOutputStream; 3 import java.io.ObjectInputStream; 4 import java.io.ObjectOutputStr

java中的异常处理原理浅谈

什么是异常呢: 在现实生活中,总会有一些问题,聚焦在生活上,我们会有工作问题,比如工作不满意,工作薪水低,工作没有发展前景,那么我们会成为这是一个“问题”. 在java的世界中,那么我们相对应的是程序,那么程序也有这样或者那样的问题,那么我们成为“异常”.异常就是程序在运行时出现的不正常现象. java把异常封装成对象的描述,来高度的概括. java中Error我们无能为力.我们还是聊聊Exception Exception的分类: 1.编译时异常 必须进行捕获 2.运行时异常(也就是Runti