首页 > 其他分享 >七,对象流(序列化)

七,对象流(序列化)

时间:2024-10-21 20:20:46浏览次数:5  
标签:Java ObjectInputStream ObjectOutputStream 对象 new 序列化

Java对象流(Object Streams)详解

在Java中,对象流是用于对象的序列化和反序列化。序列化是将对象的状态信息转换为可以存储或传输的格式的过程,而反序列化则是将这种格式还原为Java对象的过程。对象流包括对象输出流ObjectOutputStream和对象输入流ObjectInputStream

序列化与反序列化

序列化

序列化是将对象转换为数据流的过程,这通常用于网络传输或持久化存储。

  • 对象输出流ObjectOutputStream
    • 只有实现了Serializable接口的类的对象才可以进行序列化。

反序列化

反序列化是将数据流还原为对象的过程。

  • 对象输入流ObjectInputStream

对象流的使用

对象输出流:ObjectOutputStream

ObjectOutputStream用于将Java对象序列化为字节流。

构造方法

// 使用OutputStream构造ObjectOutputStream
OutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));

序列化对象

try {
    MyObject obj = new MyObject();
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serializedObj.txt"));
    os.writeObject(obj); // 序列化对象
} catch (IOException e) {
    e.printStackTrace();
}

对象输入流:ObjectInputStream

ObjectInputStream用于从字节流中反序列化对象。

构造方法

// 使用InputStream构造ObjectInputStream
InputStream is = new ObjectInputStream(new FileInputStream("object.dat"));

反序列化对象

try {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serializedObj.txt"));
    MyObject obj = (MyObject) ois.readObject(); // 反序列化对象
    System.out.println("Object read: " + obj);
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

序列化与反序列化的注意事项

  • serialVersionUID:每个可序列化的类都应该有一个serialVersionUID,用于验证序列化和反序列化过程中的版本兼容性。
  • transient关键字:使用transient关键字声明的成员变量不会被序列化。
  • 安全问题:序列化可能会引发安全问题,因为反序列化时可以创建任何对象。

字符流与对象流的关系

字符流(如FileReaderFileWriter)是对象流的特例,它们处理的是字符数据的序列化和反序列化。

编码与解码

  • 编码:将字符数据转换为字节数据的过程,类似于序列化。
  • 解码:将字节数据转换回字符数据的过程,类似于反序列化。

结论

对象流是Java中处理对象序列化和反序列化的重要工具,它允许我们保存和恢复对象的状态,以及在网络上传输对象。通过ObjectOutputStreamObjectInputStream,我们可以轻松地序列化和反序列化对象。在实际编程中,合理使用对象流可以大大提高程序处理复杂数据的能力。通过上述示例和解释,你应该能够更好地理解和应用对象流。

标签:Java,ObjectInputStream,ObjectOutputStream,对象,new,序列化
From: https://www.cnblogs.com/bjynjj/p/18490293

相关文章

  • 初始面向对象(上)
    大二学生,初始面向对象上,刚开始感觉颇有难度,不过经过反复思考和写代码后,难度也就相应降下来了。个人认为学java很重要一点就是要针对每个模块的知识做思维导图,这样各个知识点的联系就一清二楚了,这样写代码的时候才能写得更快。初学java,做的思维导图还有待完善。如果有的地方有错......
  • 把对象转换为json,在postman传递请求
    publicstaticvoidmain(String[]args){PackSaveTimeReqpackSaveTimeReq=newPackSaveTimeReq();packSaveTimeReq.setType(ThirdPartyOperationTypeEnum.WORK_START);packSaveTimeReq.setOperationTime(LocalDateTime.now());p......
  • GCN(图卷积神经网络)中的**信息聚合**和传统聚类算法是不同的概念,尽管它们都涉及到将某
    GCN(图卷积神经网络)中的信息聚合和传统聚类算法是不同的概念,尽管它们都涉及到将某些对象的信息整合在一起。下面我将详细解释两者的差异:1.GCN中的信息聚合GCN中的信息聚合过程是节点级别的邻居信息融合,主要目的是通过图的拓扑结构更新节点的特征表示。每个节点通过其邻......
  • 在Lua中实现Rust对象的绑定tT
    合集-算法(7)1.TimerWheel(计时轮)在Rust中的实现及源码解析06-122.Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试06-183.Lru-k在Rust中的实现及源码解析06-214.带有ttl的Lru在Rust中的实现及源码解析06-24:westworld加速5.Lfu缓存在Rust中的实现及源码解析06-276.Rust宏之der......
  • 【STC15】面向对象的.h/.c程序架构
    .h文件#ifndef__MAIN_H_#define__MAIN_H_/*Includes------------------------------------------------------------------*/#include<STC15.h>/*externvariables-----------------------------------------------------------*//*externfunctionprot......
  • Linux网络:序列化与反序列化
    Linux网络:序列化与反序列化序列化与反序列化jsonjsoncppValue对象序列化反序列化WriterReader序列化与反序列化在网络通信中,最重要的就是通过接口,将数据通过网络发送给另一台主机。那么另一台主机收到数据后,就可以对数据进行处理了。但是网络通信中,数据不是简单......
  • 可迭代对象
    ◼但是上面的代码整体来说看起来是有点奇怪的:我们获取一个数组的时候,需要自己创建一个index变量,再创建一个所谓的迭代器对象;事实上我们可以对上面的代码进行进一步的封装,让其变成一个可迭代对象;◼什么又是可迭代对象呢?它和迭代器是不同的概念;当一个对象实现了itera......
  • 在Lua中实现Rust对象的绑定
    实现目标:能将Rust对象快速的映射到lua中使用,尽可能的简化使用。功能目标以structHcTestMacro为例:类型构建,在lua调用localval=HcTestMacro.new()可构建类型析构,在lua调用HcTestMacro.del(val)可析建,仅限lightuse**rdata字段的映射,假设有字段hc,我们需要能快速的进行字段......
  • 云函数+对象存储全包!MemFire Cloud让开发如此轻松
    在开发世界里,想要快速交付一个产品,后端服务、数据存储和API接口等往往是让开发者最头疼的环节。尤其是对于个人开发者或者小型团队而言,想要自己搭建完整的后端架构,无疑是一项费时费力的工作。现在有了MemFireCloud,这一切都变得简单了。MemFireCloud是一款为“懒人”开发者......
  • 面向对象与设计模式第一课:深入理解OOP
    第三章:面向对象与设计模式第一课:深入理解OOP面向对象编程(OOP)是一种编程范式,它将程序结构视为由对象组成,促进了代码的重用性和可维护性。在这一课中,我们将深入分析OOP的四个基本特性:封装、继承、多态和抽象,并提供相应的示例与实践。1.OOP基本特性1.1封装封装是OOP的核心......