ObjectInputStream和ObjectOutputStream

举报
周小末天天开心 发表于 2022/12/31 17:34:21 2022/12/31
【摘要】 对象流ObjectInputStream和ObjectOutputStream序列化和反序列化(1)序列化就是在保存数据时,保存数据的值和数据类型(2)反序列化就是在恢复数据时,恢复数据的值和数据类型(3)需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:1)Serializable //这是一个标记接口,没有方法2)Extern...

对象流ObjectInputStream和ObjectOutputStream

序列化和反序列化

(1)序列化就是在保存数据时,保存数据的值和数据类型

(2)反序列化就是在恢复数据时,恢复数据的值和数据类型

(3)需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该

类必须实现如下两个接口之一:

1)Serializable //这是一个标记接口,没有方法

2)Externalizable //该接口有方法需要实现,因此我们一般要实现上面的Serializable接口

ObjectOutputStream

ObjectOutputStream (Java Platform SE 6)

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

只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

应用案例

使用ObjectOutputStream序列化基本数据类型和一个Dog对象,包含name和age属性,并保存到data.dat文件中

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

public class ObjectOutStream_ {
    public static void main(String[] args) throws Exception {
        //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
        String filePath = "e:\\data.dat";
        
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
        
        //序列化数据到 e:\data.dat
        oos.writeInt(100);// int -> Integer (实现了 Serializable)
        oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
        oos.writeChar('a');// char -> Character (实现了 Serializable)
        oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
        oos.writeUTF("ttkx");//String
        
        //保存一个 dog 对象
        oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
        oos.close();
        System.out.println("数据保存完毕(序列化形式)");
    }
}

ObjectInputStream

ObjectInputStream (Java Platform SE 6)

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。

只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

应用案例

使用ObjectInputStream读取data.dat并反序列化恢复数据


// 1.创建流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\data.dat"));
// 2.读取, 注意顺序
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
System.out.println(ois.readObject());
System.out.println(ois.readObject());
System.out.println(ois.readObject());
// 3.关闭
ois.close();
System.out.println("以反序列化的方式读取(恢复)ok~");

注意事项和使用细节

(1)读写顺序要求一致

(2)要求序列化或反序列化对象,需要实现Serializable

(3)序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性

(4)序列化对象时,默认将里面所有的属性都进行序列化,但除了static和transient修饰的成员

(5)序列化对象时,要求里面的属性的类型也需要实现序列化接口

(6)序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化





【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。