您当前的位置: 首页 >  Java

慕晨sekurlsa

暂无认证

  • 6浏览

    0关注

    82博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JAVA基础(五十一)——对象流

慕晨sekurlsa 发布时间:2022-10-07 01:33:43 ,浏览量:6

一、目录
  • 引出对象流
  • 序列化和反序列化
  • 对象流基本介绍
  • ObjectOutputSteam
  • ObjectInputSteam
  • 对象流细节
二、引出对象流
  1. 将int num = 100这个int数据保存到文件中,注意不是100数字,而是int 100,并且,能够从文件中直接恢复int 100。
  2. 将Dog dog = new Dog(“小黄”, 3)这个dog对象保存到文件中,并且能够从文件恢复。
  3. 上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化操作。
三、序列化和反序列化
  1. 序列化就是在保存数据时,保存数据的值和数据类型。
  2. 反序列化就是在恢复数据时,恢复数据的值和数据类型。
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下连个接口之一:
    • Serializable
    • Externalizable //该接口有方法需要实现,因为一般不会使用它,使用Serializable。
四、对象流基本介绍
  1. 功能:提供了对基本类型或对象类型的序列化和反序列化的方法。
  2. ObjectOutputStream提供序列化功能。
  3. ObjectInputStream提供反序列化功能。
五、ObjectOutputSteam

示例: 使用ObjectOutputStream序列化基本数据类型和一个Dog对象(name, age),并保存到data.dat文件中。

package com.javaObjectOutputStream;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class JavaObjectOutputStream {
    public static void main(String[] args) throws Exception{
        String filepath = "E:\\code\\java\\code\\data.dat";

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filepath));

        objectOutputStream.writeInt(100);   //int -> Integer(实现了Serializable接口)
        objectOutputStream.writeBoolean(true);  //boolean -> Boolean(实现了Serializable接口)
        objectOutputStream.writeChar('a');  //char -> Character(实现了Serializable接口)
        objectOutputStream.writeUTF("hello");  //String实现了Serializable接口

        //保存一个dog对象
        objectOutputStream.writeObject(new Dog(1, "Tog"));

        objectOutputStream.close();
        System.out.println("Serializable Successfully");
    }
}

class Dog implements Serializable {
    private int age;
    private String name;

    public Dog(int age, String name) {
        this.age = age;
        this.name = name;
    }
    
     @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

六、ObjectInputSteam

将上面序列化的文件data.dat反序列化,恢复数据。

读取(反序列化)的顺序需要和保存数据(序列化)的顺序一致,否则会出现异常。

package com.javaObjectInputStream;

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

public class JavaObjectInputStream {
    public static void main(String[] args) throws Exception{
        String filepath = "E:\\code\\java\\code\\data.dat";

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filepath));

        System.out.println(objectInputStream.readInt());
        System.out.println(objectInputStream.readBoolean());
        System.out.println(objectInputStream.readChar());
        System.out.println(objectInputStream.readUTF());
        System.out.println(objectInputStream.readObject());

        objectInputStream.close();
    }
}

七、对象流细节
  1. 读写顺序要一致。
  2. 要求实现序列化或反序列化对象,需要实现Serializable。
  3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性。
  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员。
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口。
  6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。
关注
打赏
1663680270
查看更多评论
立即登录/注册

微信扫码登录

0.0382s