JAVA_IO_ObjectOutputStream与ObjectInputStream(六)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/84312912

ObjectOutputStream

  • 该类继承自 OutputStream
    
  • 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象。

  • 只有支持java.io.Serializable接口的对象才能写入流中。 每个可序列化对象的类被编码,包括类的类名和签名,对象的字段和数组的值以及从初始对象引用的任何其他对象的关闭。

  • 方法writeObject用于将一个对象写入流中。 任何对象,包括字符串和数组,都是用writeObject编写的。 多个对象或原语可以写入流。 必须从对应的ObjectInputstream读取对象,其类型和写入次序相同。

  • 原始数据类型也可以使用DataOutput中的适当方法写入流中。 字符串也可以使用writeUTF方法写入。

员工实体类Staff

package com.hp.io;

import java.io.Serializable;

/**
 * 员工类
 * 实现序列化的接口
 * @author 晓电脑
 */
public class Staff  implements Serializable{


    private static final long serialVersionUID = 2497140260621995246L;

    //transient 表示name 不被序列化
    private transient String name;
    private int pay;



    public Staff(){}

    public Staff(String name, int pay) {
        this.name = name;
        this.pay = pay;
    }

    public String getName() {
        return name;
    }

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

    public int getPay() {
        return pay;
    }

    public void setPay(int pay) {
        this.pay = pay;
    }

    @Override
    public String toString() {
        return "Staff{" +
                "name='" + name + '\'' +
                ", pay=" + pay +
                '}';
    }
}

ObjectOutputStream 中的

  • writeObject 使用如下

    public static void main (String[] args) {
       try {
            write("C:/Users/晓电脑/Desktop/a.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
 public static void write(String destPath) throws IOException {
        Staff staff = new Staff("zs", 10000);
        ObjectOutputStream outputStream = new ObjectOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream(
                                new File(destPath)
                        )
                )
        );
        //放入序列化对象
        outputStream.writeObject(staff);

        //释放资源
        outputStream.flush();
        outputStream.close();

    }

运行结果如下(注意这并不是错误的)

               

接下来我们使用ObjectInputStream来读取序列化写入的内容

    public static void main (String[] args) {
        try {
            read("C:/Users/晓电脑/Desktop/a.txt");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }   
 public static void write(String destPath) throws IOException {
        Staff staff = new Staff("zs", 10000);
        ObjectOutputStream outputStream = new ObjectOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream(
                                new File(destPath)
                        )
                )
        );
        //放入序列化对象
        outputStream.writeObject(staff);

        //释放资源
        outputStream.flush();
        outputStream.close();

    }

得到员工的序列化工资 

其中在读取序列化的过程中有这样几个问题

1),错误StreamCorruptedException: invalid type code: 00 

2),Java serialVersionUID生成 我在使用序列化的过程中  第一次由于没有生成Java serialVersionUID 然后我用idea下载了一个插件自动生成Java serialVersionUID,然后重新写入,就不会报错了

总结:

1),不是所有的对象都可以序列化 java.io.Serializable

2),不是所有的属性都要序列化 可以使用 Transient 来不被序列化

扩展:

需求 :如果是多个对象输出到文件,然后读取 哪有该如何处理呢?

ObjectInputStream 与 ObjectOutputStream 没有提供操作多个对象的方法,但是我们可以使用对象数组来保存,如下

读取a.txt文件

结果为

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/84312912