对象流,序列化和反序列化 day18

package com.shujia.day18.ketang;

import java.io.*;

/*
    序列化流:
        序列化:将一个对象转换成网络中传输的流
            对象输出流:ObjectOutputStream     将一个类的对象写进文本中
        反序列化:将网络中传输的流还原成一个对象
            对象输入流:ObjectInputStream      将写入的类的对象输入到JVM,如果要调用该对象的方法,则需要向下转型
 */
/*
    一个类对象将来要想被序列化,必须要实现Serializable接口,这个接口中没有任何的方法和常量,称为标记接口

    我们在写完对象后,又修改了类中的内容,再读取的还原对象的时候,报错了InvalidClassException
    com.shujia.day18.ketang.Student;
    local class incompatible:
        stream classdesc serialVersionUID = 2442942279365203766,
        local class serialVersionUID = 2935475373948736279,

    原因是修改前有一个地址值,修改后又有一个新的地址值,因为序列化的对象是之前的地址值,所以不能进行反序列化

    解决方案:将serialVersionUID写固定,将来谁都不能改,自动生成即可。

    若成员不想被序列化存储,使用java提供一个关键字进行修饰 transient

 */
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) {
//        write();
//
        read();

    }

    public static void read(){
        //public ObjectInputStream(InputStream in)
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("src/com/shujia/day18/data/obj.txt"));
            Object o = ois.readObject(); // new Student("魏一民", 18);实际读出来的是一个对象,若调用该对象的方法,需要向下转型

            Student student = (Student) o;//向下转型
            System.out.println(student);


        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(ois!=null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void write(){
        ObjectOutputStream oos = null;
        try {
            //ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
            oos = new ObjectOutputStream(new FileOutputStream("src/com/shujia/day18/data/obj.txt"));
            // void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
            Student s1 = new Student("魏一民", 18,"安徽合肥","110");
            oos.writeObject(s1);
            oos.flush(); // 刷到文件中


        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

学生类

package com.shujia.day18.ketang;

import java.io.Serializable;

/*
    一个类对象将来要想被序列化,必须要实现Serializable接口,这个接口中没有任何的方法和常量,称为标记接口

    我们在写完对象后,又修改了类中的内容,再读取的还原对象的时候,报错了InvalidClassException
    com.shujia.day18.ketang.Student;
    local class incompatible:
        stream classdesc serialVersionUID = 2442942279365203766,
        local class serialVersionUID = 2935475373948736279,

    原因是修改前有一个地址值,修改后又有一个新的地址值,因为序列化的对象是之前的地址值,所以不能进行反序列化

    解决方案:将serialVersionUID写固定,将来谁都不能改,自动生成即可。

    若成员不想被序列化存储,使用java提供一个关键字进行修饰 transient

 */
public class Student implements Serializable {
    private static final long serialVersionUID = 2935475373948736279L;
    private String name;
    private int age;
    private String address;
    private transient String phone;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
posted @   ていせい  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示