java核心学习(十七) IO框架---对象序列化

一、使用对象流实现序列化。

  先定义一个可序列化的对象

    

package com.shy.IO;

import java.io.Serializable;

public class Person implements Serializable{
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    private int age;
    private String name;
    public Person(String name , int age){
        this.age = age;
        this.name = name;
    }
}

  然后将Persen类的实例使用对象流序列化


package com.shy.IO;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class WriteObject {
    public static void main(String[] args) {
        try (
                ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));
        ) {
            Person person = new Person("yuyu", 22);
            outputStream.writeObject(person);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

    }
}
 

  最后再反序列化

package com.shy.IO;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ReadObject {
    public static void main(String[] args) {
        try (
                ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.txt"))
        ) {
            Person person = (Person) inputStream.readObject();
            System.out.println(person.getName()+"的年龄为"+person.getAge());
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {

        }
    }
}
 

  由上面代码可以看出,反序列化时必须进行downcasting,而且反序列化机制度区的仅仅是java对象的数据,而且没有使用对象构造器,这表明反序列化机制无需通过构造起来初始化java对象。

二、java对象序列化算法内容简介

  1、所有保存到磁盘中的对象都有一个序列化编号。

  2、当程序试图序列化一个对象时,程序会先检查该对象是否被序列化过,只有该对象从未(在本次虚拟机中)被序列化过,系统才会将对象转化为字节序列并输出。

  3、如果某个对象已经序列化过,程序将只是直接输出一个序列化编号,而不是再次重新序列化该对象。

三、自定义序列化

  对实现了Serializable接口的对象,可使用下列三种方式来自定义序列化与反序列化。

  第一种方式,若在实例成员变量前面使用transient关键字修饰,可以指定java序列化时无需理会该实例变量;

  第二种方式,在需要序列化的类中提供如下特殊签名的方法,在这些方法中分别对java对象的成员变量用out.writeObject()方法进行存取

  

private void writeObject(java.io.ObjectOutputStream out)throws IOException;
    private void readObject(java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;
    private void readObjectNoData()throws ObjectStreamException;

  第三种方式,在序列化时将该对象替换成其他对象,此时应该为序列化提供如下方法,序列化机制会序列化该方法返回的对象。

    private Object writeReplace() throws ObjectStreamException;

  通过上面介绍,可以知道java序列化机制在将对象序列化写入文件之前,先调用被序列化对象的writeObject方法,然后再调用writeReplace方法,相对应的,在从文件中读取对象时的最后,会调用readObject方法,之后再调用readResolve方法,该方法和writeReplace方法很像,可以将源序列化对象转换为另一个对象来返回,可以用来实现白虎幸福之整个对象。

四、另一种序列化机制,实现Externalizable接口

  与serializable这种声明式接口不同,Externalizable接口里面定义了两个方法writeExternal() and readExternal()两个方法,这两个方法除了名字与writeObject和readObject不同外其他都相同,用处就是强制自定义序列化。

五、序列化的范围

  对象的类名和实例变量都会被序列化,方法、类变量,transient变量都不会被序列化。

六、serialVersionUID

  在定义序列化对象时最好手动定义序列化对象的版本,也就是在序列化对象中定义一个静态成员变量,private static fianl long serialVersionUID = 512L;用于保证class文件改变之后还可以正确反序列化。

时间: 2024-10-13 04:04:45

java核心学习(十七) IO框架---对象序列化的相关文章

JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的

java中 使用输入+输出流对对象序列化

对象: 注意记得实现 Serializable package com.nf147.sim.entity; import java.io.Serializable; public class News implements Serializable { private int id; private String title; private String body; public News() { } public News(int id, String title, String body)

深入理解JAVA I/O系列五:对象序列化

序列化 对象序列化的目标是将对象保存到磁盘中,或者允许在网络中直接传输对象.对象序列化机制允许把内存中的JAVA对象转换成跟平台无关的二进制流,从而允许将这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点,其他程序一旦获得了这种二进制流,都可以讲二进制流恢复成原来的JAVA对象. 序列化为何存在 我们知道当虚拟机停止运行之后,内存中的对象就会消失:另外一种情况就是JAVA对象要在网络中传输,如RMI过程中的参数和返回值.这两种情况都必须要将对象转换成字节流,而从用于保存到

java核心学习笔记(一) javaJDK目录阐述

本系列博客为原创博客,旨在学习整理之用,转载请注明出处,谢谢. java作为最成功的语言之一,有很多地方可以学习,不仅仅是语言的用法. 本次学习目标在于系统的从javaSE学起,学习java的理念思想,以及从代码层次直接学习javaSE和他的用法,以此来为将来学习java类库的编写.java开发框架以及javaEE.java虚拟机.javaWEB打下良好的基础,努力让编程成为一种思想,成为身体的一部分. 这次从头重新对java的学习,目的是要学习java的世界观和方法论,学习过程要符合哲学理论,

java核心学习(十八) javaNIO框架---“块”模型的IO

一.java新IO概述 javaIO中的输入流和输出流都是通过字节的移动来处理的,面向流的输入输出系统一次只能处理一个字节,因此效率不高,而且传统的输入输出流是阻塞试的,也就是说当无法读到数据时,当前线程会被阻塞直到读取到有效数据才会继续运行. java1.4之后提供了一系列改进的输入输出类与方法,并且以NIO为基础改写了java.io包中的类,新增了满足NIO的功能. NIO采用内存映射文件的方式,java.nio中主要的包有: java.nio ,主要包含于Buffer相关的类: java.

java核心学习(十九) javaNIO框架---文件锁

在上一节提到的FileChannel中提供了lock()/tryLock()方法可以获得文件锁FileLock对象,从而锁定文件,这里的文件锁是进程级别的锁,而非线程锁. lock()方法是阻塞试的,当调用该方法且无法得到文件锁,程序将一直阻塞. tryLock()方法是非阻塞式的加锁方法,如果获得了文件锁,则该方法返回该文件锁,否则将返回null. 文件锁分为共享锁和排他锁,当lock/tryLock方法的第三个参数为true时表明该锁是共享锁,共享锁允许多个进城来读取该文件,但阻止其他进程获

Java核心学习 —— IO

整个Java IO体系都是基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,根据不同的数据载体或功能派生出来的. 一.同步.异步.阻塞.非阻塞 1.1 同步与异步 同步和异步关注的是通讯方式. 同步:需要等所有操作完成后,返回结果. 异步:不需要等所有操作完成,返回结果. 1.2 阻塞与非阻塞 阻塞与非阻塞关注的是等待状态. 1.3 例子 例子1:电水壶烧水 同步阻塞:水壶烧水,人要一直等在水壶旁边,直到水烧开. 同步非阻塞:水壶烧

Java SE学习笔记-IO

1.主要内容 2.详细内容 2.1.IO流概念 (1)用来处理设备(硬盘,控制台,内存)之间的数据: (2)Java中对数据的操作都是通过流的方式: (3)Java中用于操作流的类都是放在IO包内: (4)按照流操作的数据类型不同,可以分为字节流和字符流:而字符流是为了方便中文的操作而来的: (5)按照流的流向不同分为:输入流和输出流. 2.2.IO流常用基类 2.2.1.字节流的抽象基类 完整图如下图所示: 其中重点的类如下图所示: (1)InputStream:输入字节流,字节读取流抽象类:

java web 学习八(HttpServletResponse对象2)

一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: package gacl.response.study; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOExceptio