IO流-ObjectInputStream对象处理流(序列化与反序列化)

2023-11-06 03:50

本文主要是介绍IO流-ObjectInputStream对象处理流(序列化与反序列化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对象处理流

ObjectInputStream (反序列化), ObjectOutputStream(序列化

在开发中会有这样一些需求, 例如 要求将 int 100 , Dog对象 序列化到 文件中, 需要时再反序列化 到 代码中。 

序列化和反序列化

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

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

3.需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

serializable //这是一个标记接口,  推荐使用

Externalizable //需要重写方法,较为麻烦,不推荐

类图

构造方法

常用方法

序列化与反序列化示例

特别注意: 序列化与反序列化的顺序必须一致,否则会报错

ObjectOutputStream objectOutputStream = null;//序列化后是特殊的格式, 序列化的文件后缀可以任意写, 没有固定格式String s = "f:\\xuliehua.dat";try {objectOutputStream = new ObjectOutputStream(new FileOutputStream(s));objectOutputStream.writeInt(100); //先自动装箱,Integer实现了Serializable接口objectOutputStream.writeBoolean(true);//先自动装箱,Boolean实现了Serializable接口objectOutputStream.writeChar('a');//.....objectOutputStream.writeDouble(1.2);//.....objectOutputStream.writeUTF("爱你一万年");//.....objectOutputStream.writeObject(new Pigg(1,1.2));//.....System.out.println("序列化完成");} catch (IOException e) {throw new RuntimeException(e);}finally {if(objectOutputStream != null) {try {objectOutputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}}
   ObjectInputStream objectInputStream = null;String s = "f:\\xuliehua.dat";int val = 0;try {//反序列化一定要按照序列化的顺序来写代码objectInputStream = new ObjectInputStream(new FileInputStream(s));System.out.println(objectInputStream.readInt());System.out.println(objectInputStream.readBoolean());System.out.println(objectInputStream.readChar());System.out.println(objectInputStream.readDouble());System.out.println(objectInputStream.readUTF());Object object = objectInputStream.readObject();System.out.println(object.getClass());Pigg pigg = (Pigg)object;System.out.println(pigg.toString());}catch (IOException  e) {throw new RuntimeException(e);}
//        catch (ClassNotFoundException e) {
//            throw new RuntimeException(e);
//        }finally {if(objectInputStream != null){try {objectInputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}}
public class Pigg implements Serializable {int a;double b;public static final long serialVersionUID = 1L; //增加这个版本号,提高兼容性public Pigg(int a, double b) {this.a = a;this.b = b;}public int getA() {return a;}public void setA(int a) {this.a = a;}public double getB() {return b;}public void setB(double b) {this.b = b;}@Overridepublic String toString() {return "pigg{" +"a=" + a +", b=" + b +'}';}
}

 public static final long serialVersionUID = 1L; //增加这个版本号,提高兼容性

节点流和处理流注意事项和细节说明

1)读写顺序要一致

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

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

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

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

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

这篇关于IO流-ObjectInputStream对象处理流(序列化与反序列化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354312

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果