字节流和处理流的对象反序列化问题

news2024/9/28 17:31:17

细节:

  1. 读写要保持一致

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

  3. 要求序列化或反序列化对象,需要实现Serializable

  4. 序列化对象时,要求里面的属性也要实现序列化接口

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

 输入流:将数据写入文件,data.dat中,使用反序列化手段,将数据打印到控制台上:

public class ObjectOutputStream_ {
    public static void main(String[] args) throws IOException {
        //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保持
        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(5.9);  //double --> Double (实现了 Serializable)
        oos.writeUTF("Monian is studying Java!");//String (实现了 Serializable)
        oos.writeObject(new Dog("汤米",8));
        oos.close();
        System.out.println("数据保存完毕(序列化)~");
    }
}

 反序列化手段打印到控制台上的代码如下:

public class ObjectInputStream_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //指定反序列化的文件
        String filePath = "E:\\data.dat";

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        /**
         * 1.读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
         * 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());

        //dog 的编译类型
        Object o = ois.readObject();
        System.out.println("dog的运行类型="+o.getClass());
        System.out.println("dog的信息="+o);

        /**
         * 1.如果我们希望调用 Dog方法 ,需要向下转型
         * 2.需要我们交Dog类的定义 ,拷贝到可以引用的位置
         * Dog dog = (Dog) o;
         */
          Dog dog = (Dog) o;
        System.out.println("dog.name="+dog.getName());

        //关闭流,关闭外层流即可,底层会关闭FileInputStream 流
        ois.close();
        System.out.println("数据(反序列化)打印完毕~");
    }
}

 这里一定要注意;当对对象进行操作的时候一定要注意,将对象类,实现Serializable接口,并且做成公共类,这样才能保证,反序列化的对象保持一致;输出时,输出的类型顺序也要原样输出

import java.io.Serializable;

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

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

    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 Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

打印结果:

 注意:当内容更改时,需要重新运行输入流,输出流才能输出,否则就会报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java-- 静态数组

1.静态初始化数组 定义数组的时候直接给数组赋值。 2.静态初始化数组的格式: 注意: 1."数据类型[] 数组名"也可以写成"数据类型 数组名[]"。 2.什么类型的数组只能存放什么类型的数据 3.数组在计算机中的基本原理 当计算机遇到…

【优选算法精品】前缀和

文章目录 一、前缀和前缀和问题一维前缀和模板二维前缀和模板 细节处理题目1思路细节处理: 题目2思路 题目3题目4题目5题目6总结 一、前缀和 前缀和问题 前缀和用来快速解决某一段连续区间的和。 时间复杂度O(1) 注意:不要背模板,不要背模…

死锁Deadlock

定义 死锁是指两个或多个线程互相持有对方所需的资源,从而导致它们无法继续执行的情况。如下图所示,现有两个线程,分别是线程A及线程B,线程A持有锁A,线程B持有锁B。此时线程A想获取锁B,但锁B需等到线程B的结…

计算机网络之数据链路层(全)

[复习提示] 王道:本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上,重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议,特别是CSMA/CD协议和以太网帧格式,以及局域网的争用期和最…

C++学习笔记之三(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray),它定义了十个大类,其中包括…

只有向内生长,才能向外绽放——中国人民大学与加拿大女王大学金融硕士

这个时代,产业迭代、竞争愈发激烈、世界局势变幻等这些都是我们无法控制的事。我们能做到的是不断地努力提升自己,成为所在领域的佼佼者。人的成长之路,就像是一场循序渐进的蜕变。不断努力是让自己逐步增值的过程。只有向内生长,…

世界经济论坛:ChatGPT等生成式AI,对全球23%岗位产生巨大影响

世界经济论坛与全球最大上市咨询公司之一埃森哲合作,联合发布了《未来工作:大语言模型与就业》白皮书。 世界经济论坛表示,随着ChatGPT、Midjourney、Github Copilot等生成式AI的飞速发展,对全球经济和劳动市场产生巨大影响。未来…

手写Vue渲染器render函数

使用js对象来描述UI更加的灵活。“这种对象”在vue框架中被称为虚拟DOM,渲染函数内部可以创建虚拟DOM,然后vue.js可以将其内容进行渲染。 1.渲染器的介绍 渲染器的作用就是把虚拟DOM渲染为真实DOM 思考下,我们有一个虚拟 DOM,如…

js数组的常用方法

目录 1. 添加/删除元素 2. 查找和遍历 3. 转换 4. 排序 5. 其他 JavaScript中的数组是一种用于存储多个值的对象。数组提供了一系列的方法来进行操作,包括添加、删除、遍历和搜索等。下面列举了一些JavaScript数组的常用方法: 1. 添加/删除元素 pu…

C指针 --- 进阶

目录 1. 字符指针 1.1. 一般使用 1.2. 另一种使用 2. 指针数组 3. 数组指针 3.1. 数组指针 3.2. 数组名和&数组名 3.3. 数组指针的用处 1. 传递一个数组 2. 传递数组首元素的地址 3. 数组指针处理一维数组 4. 数组指针处理二维数组 4. 数组传参和指针传参 4.1…

PHP危险函数

PHP危险函数 文章目录 PHP危险函数PHP 代码执行函数eval 语句assert()语句preg_replace()函数正则表达式里修饰符 回调函数call_user_func()函数array_map()函数 OS命令执行函数system()函数exec()函数shell_exec()函数passthru() 函数popen 函数反引号 实列 通过构造函数可以执…

杂牌行车记录仪特殊AVI结构恢复案例

最近遇到一个杂牌的行车记录仪需要恢复数据,其使用AVI格式,但是在扫描恢复的过程中却发现厂家对其AVI结构进行了“魔改”致程序无法正常识别 故障存储:16G SD卡 fat32文件系统 故障现象: 16G的SD卡,在发生事故后客户尝试自行接到手机上读…

小红书素人铺量推广费用是多少?

小红书作为一个拥有庞大用户群体的社交电商平台,在品牌营销和产品推广方面具有巨大的潜力。其中,素人铺量推广作为一种常见的推广方式,被越来越多的品牌和商家所采用。但是,对于很多刚刚接触小红书推广的人来说,素人铺…

二维码智慧门牌管理系统升级解决方案:一级属性 二级属性

文章目录 前言一、什么是智慧门牌管理系统?二、一级属性 vs. 二级属性三、升级中的实践意义 前言 在本文中,我们将深入探讨二维码智慧门牌管理系统的升级解决方案,特别聚焦于一级属性和二级属性的关键概念。我们将详细解释这些概念&#xff…

如何做好建筑翻译呢

近年来,随着跨国工程项目增加,建筑翻译也越来越受到重视。尤其是建筑图纸翻译在工程设计、规划和施工等方面都具有重要意义。那么,如何做好建筑翻译呢,建筑工程翻译哪个比较正规? 在建筑行业日新月异的发展中&#xff…

项目进度延误,危机管理5大注意事项

项目延误危机管理的重要性是不可忽视的。项目延误可能会导致资源浪费、成本增加、客户不满、信誉受损等一系列问题,严重影响项目的成功与效益。因此,有效地进行项目延误危机管理是至关重要的,一般主要是从以下5个方面进行管理: 1、…

python yield用法

用法和ts中的差不多 def test():i[1,2,3,4]for x in i:yield x for j in test():print(j) 使用的时候就会返回一次值 实际使用中可以这样使用,例如我把df按照半小时进行分割,然后分别取处理每半小时的数据 def test():final_df[raw_timestamp] pd.t…

js使用构造函数的注意点?

目录 前言 使用构造函数的注意点 1. 使用 new 关键字 用法 代码示例 理解 2. 构造函数首字母大写 用法 代码示例 理解 3. 在构造函数中返回对象 用法 代码示例 理解 4. 使用原型链 用法 代码示例 理解 总结 前言 JavaScript 是一种基于原型的语言&#xff…

【C#】LIMS实验室信息管理系统源码

一、系统概述 LIMS(Laboratory Information Management System)即实验室信息管理系统,是通过对样品检验流程、分析数据及报告、实验室资源和客户信息等要素的综合管理,按照标准化实验室管理规范,建立符合实验室业务流程的质量体系,实现实验室信息化管理。是实验室提高分析水平…

serverSocket编程DEMO

目录 0、jar包依赖 1、ServerSocket服务端主程序: 2、任务执行类 3、tomcatJdbcPool: 4、客户端: 0、jar包依赖 1、ServerSocket服务端主程序: package socket;import java.net.ServerSocket; import java.net.Socket; impo…