ObjectOutputStream/ObjectInputStream

对象的输入输出流
  • 作用:读写对象信息。写到文件上将对象信息持久化
    对象输出流:ObjectOutputStream
    对象输入流:ObjectInputStream

注意:

  1. 如果对象需要被写出到文件上,则对象所属的类必须要实现Serializable接口。Serializable接口没有方法,只是一个标识接口
  2. 对象的反序列化创建对象时不会调用构造方法
  3. serialVersionUID用于记录class文件的版本信息,根据类名、成员名、包名、工程名算出来的
  4. 使用ObjectInputStream反序列化时,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID对比,如果两个id不一致,则反序列化失败
  5. 如果序列化与反序列化时有可能修改类的成员,则最好在一开始就给这个类指定一个serialVersionUID,这样序列化与反序列化时,jvm就不会自己计算serialVersionUID了。
  6. 如果一个对象的某个数据不想被序列化到硬盘上,可以使用transient关键字修饰
  7. 如果一个类维护了另外一个类的引用,则这个另外的类也要实现Serializable接口
package test;

import java.io.*;

class Address implements Serializable{

    private static final long serialVersionUID = 1L;

    String country;

    String city;

    public Address(String country,String city){
        this.country=country;
        this.city=city;
    }
}


class User implements Serializable{

    // 指定serialVersionUID
    private static final long serialVersionUID = 1L;

    String userName;

    String password;

    transient int age;//不会被序列化到硬盘上

    Address address;

    public User(String userName,String password,int age,Address address){
        this.userName=userName;
        this.password=password;
        this.age=age;
        this.address=address;
    }

    public String toString(){
        return "用户名:"+this.userName+"  密码:"+this.password+" 年龄:"+this.age+" 地址:"+this.address.city;
    }

}


public class Demo4 {

    public static void main(String[] args) throws IOException, ClassNotFoundException{

        writeObj();
        readObj();
    }

    //定义方法把对象的信息写到硬盘上------称为对象的序列化
    public static void writeObj() throws IOException{
        //把user对象的信息持久化
        User user=new User("admin","123",21,new Address("中国","北京"));
        //找到目标文件
        File file=new File("F:\\test\\obj.txt");
        //建立数据输出流对象
        FileOutputStream fileOutputStream=new FileOutputStream(file);
        //建立对象的输出流对象
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
        //把对象写出
        objectOutputStream.writeObject(user);
        //关闭资源
        objectOutputStream.close();
    }

    //把文件中的对象信息读取出来-----对象的反序列化
    public static void readObj() throws IOException, ClassNotFoundException{
        //找到目标文件
        File file=new File("F:\\test\\obj.txt");
        //建立数据的输入通道
        FileInputStream fileInputStream=new FileInputStream(file);
        //建立对象的输入流对象
        ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
        //读取对象信息
        User user=(User) objectInputStream.readObject();
        System.out.println(user);
        //关闭资源
        objectInputStream.close();  
    }
}

反序列化后的结果:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值