java对象序列化

序列化

对象序列化是指将对象保存到磁盘当中,或者是在网络当中传输对象

这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型、对象的数据和对象中存储的属性等信息,字节序列写到文件之后,相当于文件中持久化保存了一个对象的信息

反之,该字节序列还可以从文件中读取回来,重构对象,对其进行反序列化操作

对象写入一个文件后进行输出

通过原始的手法,把一个学生类对象信息写入的文件里面,最后进行输出

思路

  1. 创建一个学生类的对象,设置基础属性,姓名,年龄,性别
  2. 定义一个方法,把学生类对象里面的信息写入到文件
  3. 定义一个方法,读取写入学生信息的文件,读取成为字符串,进行拆分,读取到的信息,放到匿名学生空间,进行返回

demo:Student类

package com.itxs.demo04;

/**
 * @Classname : Student
 * @Description : TODO 学生类
 * @Author : lin_refuel@qq.com
 */
public class Student {
    //学生的三个成员属性
    private String name; //姓名
    private String sex; //性别
    private int age; //年龄

    public Student() {
    }
    public Student(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    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 int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

demo: 写入和读取Student类的信息

package com.itxs.demo04;

import java.io.*;

/**
 * @Classname : demo01
 * @Description : TODO 对象存储到文件里面
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) throws IOException {
        // 对象写入文件
       // month();
        Student student = move();
        System.out.println(student);
    }

    /**
     * 返回一个学生对象的信息
     * @return
     */
    private static Student move() throws IOException {
        //读取学生类信息模板
        BufferedReader br = new BufferedReader(new FileReader("D:/JAVA/ce/Student.txt"));
        String str = br.readLine();//读取一行
        String[] s = str.split("##");//通过##进行分割,分割成字符串数组
        br.close();
        // 读取的信息,对匿名的空间里面三个属性进行初始化, Integer.parseInt把字符串转int
        return new Student(s[0],s[1],Integer.parseInt(s[2]));//把匿名空间进行返回
    }

    /**
     * 学生对象写入文件里面
     */
    private static void month() throws IOException {
        //实例化学生类对像
        Student student = new Student("小肆", "男", 19);
        //字符写入
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:/JAVA/ce/Student.txt"));
        //定义一个字符串,把学生姓名,年龄,性别的属性写入
        String str = student.getName() + "##" + student.getSex() + "##" + student.getAge();
        //调用方法进行写入
        bw.write(str);
        bw.close();
    }
}

运行结果:
在这里插入图片描述

对象序列化与反序列化

  • 要实现序列化与反序列化就需要使用对象序列化流和对象反序列化流:

  • 对象序列化流:ObjectOuptStream

  • 对象反序列化流:ObjectInputStream

demo:Student类

package com.itxs.demo04;

import java.io.Serializable;

/**
 * @Classname : Student
 * @Description : TODO 学生类
 * @Author : lin_refuel@qq.com
 */
public class Student implements Serializable {
    //学生的三个成员属性
    private String name; //姓名
    private String sex; //性别
    private int age; //年龄

    public Student() {
    }
    public Student(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    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 int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

序列化存储,和反序列化输出

package com.itxs.demo04;

import java.io.*;

/**
 * @Classname : demo02
 * @Description : TODO 对象序列化和反序列化存储
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //对象实实例化
       // Student student = new Student("小肆","男",19);
        //对象的序列化存储
       // ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/JAVA/ce/Student.txt"));
        //调用方法
       // oos.writeObject(student);//文件写入了一个对象
        //关闭oos
       // oos.close();
  //****************************************************************************
        //对象反序列化进行输出
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/JAVA/ce/Student.txt"));
        Object o = ois.readObject();
        Student s = (Student)o;
        System.out.println(s);
        System.out.println(s.getName());
        System.out.println(s.getSex());
        System.out.println(s.getAge());

    }
}

对象序列化存储时需要注意的事项

  • 对象序列化了一个对象之后,如果修改了对象所属的类文件,读取是否会出现问题?

  • 如果出问题了,如何处理? private static final long serivalVersionUID = 9527L

  • 如果一个对象中的某个成员的值不想被序列化,应该如何处理? 通过 transient 关键字修饰即可

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值