(每日持续更新)jdk api之ObjectOutputStream.PutField基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

关注【架构师成长之道】 输入“架构师视频课程”,即可免费获得全套架构师全套课程

 

一、java.io

1.49 ObjectOutputStream.PutField

ObjectOutputStream.PutField 是一个内部类,用于写入对象字段的值。它通常与 writeFields() 方法一起使用,用于将对象的字段值写入输出流。

ObjectOutputStream.PutField 类介绍:
所有字段:
  • 没有公共字段。

构造方法:
  • protected PutField():构造一个新的 PutField 对象。

方法摘要:
  • void put(String name, boolean value):将指定的布尔值写入字段。

  • void put(String name, byte value):将指定的字节值写入字段。

  • void put(String name, char value):将指定的字符值写入字段。

  • void put(String name, short value):将指定的短整型值写入字段。

  • void put(String name, int value):将指定的整型值写入字段。

  • void put(String name, long value):将指定的长整型值写入字段。

  • void put(String name, float value):将指定的浮点值写入字段。

  • void put(String name, double value):将指定的双精度浮点值写入字段。

  • void put(String name, Object value):将指定的对象值写入字段。

  • void write(ObjectOutput out):将字段值写入指定的 ObjectOutput 流。

简单使用例子:
javaCopy code
import java.io.*;
​
public class ObjectOutputStreamPutFieldExample {static class User implements Serializable {private static final long serialVersionUID = 1L;
​private String username;private transient String password;
​public User(String username, String password) {this.username = username;this.password = password;}
​// 自定义序列化方法private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields();}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}
​public static void main(String[] args) {String fileName = "user.ser";
​try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​// 创建对象User user = new User("john.doe", "password123");
​// 将对象写入输出流objectOutputStream.writeObject(user);
​System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,我们自定义了 User 类的序列化方法 writeObject(),并使用 PutField 对象将字段值写入输出流。最后,我们将 User 对象写入文件中。

应用场景

ObjectOutputStream.PutField 通常与自定义序列化方法一起使用,以便更灵活地控制对象的序列化过程。以下是一些常见的应用场景及相应的代码实现:

应用场景 1: 使用 PutField 自定义序列化
javaCopy code
import java.io.*;
​
public class CustomSerializationExample {static class User implements Serializable {private static final long serialVersionUID = 1L;
​private String username;private transient String password;
​public User(String username, String password) {this.username = username;this.password = password;}
​private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields();}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}
​public static void main(String[] args) {String fileName = "user.ser";
​try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​// 创建对象User user = new User("john.doe", "password123");
​// 将对象写入输出流objectOutputStream.writeObject(user);
​System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
}
应用场景 2: 将字段写入流并手动写入其他数据
javaCopy code
import java.io.*;
​
public class CustomSerializationExample {static class User implements Serializable {private static final long serialVersionUID = 1L;
​private String username;private transient String password;
​public User(String username, String password) {this.username = username;this.password = password;}
​private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("password", password);out.writeFields();
​// 手动写入其他数据out.writeInt(100); // 写入一个整数out.writeUTF("Additional data"); // 写入一个字符串}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}
​public static void main(String[] args) {String fileName = "user.ser";
​try (OutputStream outputStream = new FileOutputStream(fileName);ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
​// 创建对象User user = new User("john.doe", "password123");
​// 将对象写入输出流objectOutputStream.writeObject(user);
​System.out.println("Object written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
}

通过使用 PutField 对象,我们可以更灵活地控制对象的序列化过程,包括哪些字段需要序列化、以及是否需要额外写入其他数据等。

实战例子

以下是一个项目实战示例,演示如何使用 ObjectOutputStreamObjectInputStream 将用户对象列表序列化到文件,并从文件中读取用户对象列表。

javaCopy code
import java.io.*;
import java.util.ArrayList;
import java.util.List;
​
public class UserSerializationProject {
​static class User implements Serializable {private static final long serialVersionUID = 1L;
​private String username;private transient String password; // 密码字段不参与序列化
​public User(String username, String password) {this.username = username;this.password = password;}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}
​public static void main(String[] args) {String fileName = "users.ser";
​// 创建用户列表List<User> users = new ArrayList<>();users.add(new User("user1", "password123"));users.add(new User("user2", "password456"));users.add(new User("user3", "password789"));
​// 将用户列表写入文件writeUsersToFile(users, fileName);
​// 从文件中读取用户列表List<User> readUsers = readUsersFromFile(fileName);System.out.println("Users read from file:");for (User user : readUsers) {System.out.println(user);}}
​private static void writeUsersToFile(List<User> users, String fileName) {try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {for (User user : users) {outputStream.writeObject(user);}System.out.println("Users have been written to file successfully.");} catch (IOException e) {e.printStackTrace();}}
​private static List<User> readUsersFromFile(String fileName) {List<User> users = new ArrayList<>();try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {while (true) {try {Object obj = inputStream.readObject();if (obj instanceof User) {users.add((User) obj);}} catch (EOFException e) {break;}}} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}return users;}
}

在这个示例中,我们定义了一个 User 类来表示用户对象,然后创建了一个包含多个用户对象的列表。我们将用户列表写入文件,并且读取文件以获取用户对象列表。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

速卖通跨境智星批量注册账号所需要的资源介绍

在寻找批量注册速卖通买家账号的道路上&#xff0c;我们发现了一个强大的工具——速卖通跨境智星。但在使用它之前&#xff0c;我们需要准备以下关键资源&#xff1a; 邮箱&#xff1a;注册买家号必不可少的资源之一。我们推荐使用国外的邮箱服务&#xff0c;比如outlook、Hot…

06 flink 的各个角色的交互

前言 这里主要是 涉及到 flink 中各个角色的交互 TaskManager 和 ResourceManager 的交互 JobMaster 和 ResourceManager 的交互 等等流程 TaskManager 和 ResourceManager 的交互 主要是 包含了几个部分, 如下, 几个菜单 TaskManager向 ResourceManager 注册 Resou…

c#创建安装windows服务

背景:最近在做设备数据对接采集时,遇到一些设备不是标准的Service-Client接口,导致采集的数据不够准确;比如设备如果中途开关机后,加工的数量就会从0开始重新计数,因此需要实时监控设备的数据,进行叠加处理;考略到工厂设备比较多,实时监听接口的数据为每秒3次,因此将…

Spring Boot中实现列表数据导出为Excel文件

点击下载《Spring Boot中实现列表数据导出为Excel文件》 1. 前言 本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能&#xff0c;并解释其背后的原理、提供完整的流程和步骤&#xff0c;以及带有详细注释的代码示例。最…

centos 9 编译安装 LAMP wordpress

[rootlocalhost ~]# ll 总用量 655760 -rw-------. 1 root root 1040 2月 17 16:57 anaconda-ks.cfg drwxr-xr-x. 29 501 games 4096 2月 21 11:00 apr-1.7.4 -rw-r--r--. 1 root root 1122147 2月 21 10:57 apr-1.7.4.tar.gz drwxr-xr-x. 21 501 games …

动态规划记忆化搜索之滑雪

给定一个 R 行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能够滑动到某相…

【day02】每天三道 java后端面试题:Java、C++和Go的区别 | Redis的特点和应用场景 | 计算机网络七层模型

文章目录 1. Java、C和 Go 语言的区别&#xff0c;各自的优缺点&#xff1f;2. 什么是Redis&#xff1f;Redis 有哪些特点&#xff1f; Redis有哪些常见的应用场景&#xff1f;3. 简述计算机网络七层模型和各自的作用&#xff1f; 1. Java、C和 Go 语言的区别&#xff0c;各自的…

【免费雾锁王国】2024年新手搭建雾锁王国服务器教程

免费自建雾锁王国Enshrouded服务器&#xff0c;先领取阿里云300元无门槛代金券&#xff0c;然后在雾锁王国Enshrouded专题页一键部署&#xff0c;不需要基础&#xff0c;鼠标点选即可10秒钟创建一台雾锁王国游戏服务器&#xff0c;超简单&#xff0c;阿里云服务器网aliyunfuwuq…

vulfocus靶场搭建

vulfocus靶场搭建 什么是vulfocus搭建教程靶场配置场景靶场编排靶场优化 什么是vulfocus Vulfocus 是一个漏洞集成平台&#xff0c;将漏洞环境 docker 镜像&#xff0c;放入即可使用&#xff0c;开箱即用&#xff0c;我们可以通过搭建该靶场&#xff0c;简单方便地复现一些框架…

简单理解VQGAN

简单理解VQGAN TL; DR&#xff1a;与 VQVAE 类似&#xff0c;隐层压缩表征自回归生成的两阶段图像生成方法。增加感知损失和对抗损失&#xff0c;提高压缩表征模型解码出图片的清晰度。还可以通过编码并预置条件表征&#xff0c;实现条件生成。 隐层压缩表征自回归生成&#…

将本地项目上传到svn服务端和git

一、SVN 1.创建svn库,下面生成了三个文件夹,branches指分支,trunk下可以放项目 2.在本地checkout,填入svn库的地址,因为是新建的,所以checkout的是空文件夹 把自己的项目复制到trunk下,在项目上 右键-TortoiseSVN-add add完之后 右键-svn commit 3.idea打开这个项目,将项目跟…

QPaint绘制自定义仪表盘组件01

网上抄别人的&#xff0c;只是放这里自己看一下&#xff0c;看完就删掉 ui Dashboard.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomm…