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

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

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

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

一、java.io

1.53 ObjectStreamField

ObjectStreamField 类用于描述一个序列化类的字段。它提供了关于字段的名称、类型和序列化标志的信息。以下是关于 ObjectStreamField 的详细介绍:

ObjectStreamField 类介绍:
所有字段:
  • static final char TYPE_BOOLEAN: 表示布尔类型的字段。

  • static final char TYPE_BYTE: 表示字节类型的字段。

  • static final char TYPE_CHAR: 表示字符类型的字段。

  • static final char TYPE_SHORT: 表示短整型类型的字段。

  • static final char TYPE_INT: 表示整型类型的字段。

  • static final char TYPE_LONG: 表示长整型类型的字段。

  • static final char TYPE_FLOAT: 表示浮点型类型的字段。

  • static final char TYPE_DOUBLE: 表示双精度浮点型类型的字段。

  • static final char TYPE_OBJECT: 表示对象类型的字段。

  • static final char TYPE_ARRAY: 表示数组类型的字段。

构造方法:
  • ObjectStreamField(String name, Class<?> type): 使用指定名称和类型创建一个 ObjectStreamField 实例。

  • ObjectStreamField(String name, Class<?> type, boolean unshared): 使用指定名称、类型和序列化标志创建一个 ObjectStreamField 实例。

方法摘要:
  • String getName(): 返回字段的名称。

  • Class<?> getType(): 返回字段的类型。

  • boolean isPrimitive(): 判断字段是否是原始类型。

  • boolean isUnshared(): 判断字段是否是非共享的。

简单使用例子:

下面是一个简单的使用示例,演示了如何创建和使用 ObjectStreamField 实例:

javaCopy code
import java.io.ObjectStreamField;
import java.util.Arrays;
​
public class ObjectStreamFieldExample {
​public static void main(String[] args) {// 创建 ObjectStreamField 实例ObjectStreamField field1 = new ObjectStreamField("name", String.class);ObjectStreamField field2 = new ObjectStreamField("age", int.class, true);
​// 打印字段信息System.out.println("Field Name: " + field1.getName());System.out.println("Field Type: " + field1.getType().getSimpleName());System.out.println("Is Primitive: " + field1.isPrimitive());System.out.println("Is Unshared: " + field1.isUnshared());
​System.out.println();
​System.out.println("Field Name: " + field2.getName());System.out.println("Field Type: " + field2.getType().getSimpleName());System.out.println("Is Primitive: " + field2.isPrimitive());System.out.println("Is Unshared: " + field2.isUnshared());
​// 获取 ObjectStreamField 数组ObjectStreamField[] fields = {field1, field2};System.out.println("All Fields: " + Arrays.toString(fields));}
}

在这个示例中,我们首先创建了两个 ObjectStreamField 实例,一个表示名为 "name" 的字符串字段,另一个表示名为 "age" 的整型字段。然后,我们打印了这些字段的名称、类型、是否为原始类型以及是否为非共享字段。最后,我们创建了一个 ObjectStreamField 数组,并打印出所有字段。

应用场景

ObjectStreamField 主要用于在序列化和反序列化过程中描述类的字段信息。它通常与 ObjectStreamClass 类一起使用,以便在序列化和反序列化过程中了解类的结构。以下是一些可能的应用场景及相应的代码实现:

应用场景 1: 自定义序列化格式

有时候,你可能需要自定义序列化格式以适应特定的需求,例如,你可能想要跳过某些字段的序列化,或者使用不同的字段名。在这种情况下,你可以使用 ObjectStreamField 来描述你所需的字段,并在序列化和反序列化过程中相应地处理它们。

javaCopy code
import java.io.*;
​
public class CustomSerializationExample {
​public static void main(String[] args) {// 创建一个对象,准备进行序列化User user = new User("Alice", "12345");
​// 将字段描述传递给序列化方法ObjectStreamField[] fields = {new ObjectStreamField("username", String.class),new ObjectStreamField("password", String.class)};
​try {// 进行自定义序列化serializeObject(user, fields, "user.ser");} catch (IOException e) {e.printStackTrace();}
​// 从文件中反序列化对象try {User loadedUser = deserializeObject("user.ser");System.out.println("Loaded user: " + loadedUser);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
​private static void serializeObject(User user, ObjectStreamField[] fields, String filename) throws IOException {ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filename)) {@Overrideprotected void writeStreamHeader() throws IOException {// 覆盖默认的头部写入方法,不写入头部信息}};
​// 写入自定义字段描述outputStream.writeFields();outputStream.writeUnshared(user); // 写入对象outputStream.close();}
​private static User deserializeObject(String filename) throws IOException, ClassNotFoundException {ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filename)) {@Overrideprotected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {// 覆盖默认的类描述符读取方法,返回自定义的描述符return ObjectStreamClass.lookup(User.class);}};
​// 读取自定义字段描述inputStream.readFields();
​// 读取对象User user = (User) inputStream.readUnshared();inputStream.close();
​return user;}
}
​
// 用户类
class User implements Serializable {private static final long serialVersionUID = 1L;private String username;private String password;
​public User(String username, String password) {this.username = username;this.password = password;}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

在这个示例中,我们使用了自定义的序列化和反序列化方法,其中涉及 ObjectStreamField 类。我们创建了一个 User 类表示用户对象,然后在序列化时指定了要序列化的字段,并在反序列化时指定了要加载的字段。这样,我们就可以灵活地控制序列化和反序列化过程,从而实现自定义的序列化格式。

实战例子

下面是一个简单的项目实战例子,演示了如何使用 ObjectStreamField 类自定义序列化和反序列化过程。

假设我们有一个系统,需要存储用户的敏感信息,但不希望将密码字段序列化到文件中。在这种情况下,我们可以使用 ObjectStreamField 来指定哪些字段应该被序列化,哪些字段应该被忽略。

javaCopy code
import java.io.*;
​
// 用户类
class User implements Serializable {private static final long serialVersionUID = 1L;
​// 用于自定义序列化格式的字段描述private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("username", String.class),new ObjectStreamField("email", String.class)};
​// 用户名和邮箱字段不可序列化private transient String username;private transient String password;private transient String email;
​public User(String username, String password, String email) {this.username = username;this.password = password;this.email = email;}
​// 重写 writeObject 方法,手动控制序列化过程private void writeObject(ObjectOutputStream out) throws IOException {ObjectOutputStream.PutField fields = out.putFields();fields.put("username", username);fields.put("email", email);out.writeFields();}
​// 重写 readObject 方法,手动控制反序列化过程private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {ObjectInputStream.GetField fields = in.readFields();username = (String) fields.get("username", "");email = (String) fields.get("email", "");}
​@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", email='" + email + '\'' +'}';}
}
​
public class ObjectStreamFieldExample {
​public static void main(String[] args) {// 创建用户对象User user = new User("Alice", "password123", "alice@example.com");
​// 将用户对象保存到文件try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("user.ser"))) {outputStream.writeObject(user);System.out.println("User saved successfully.");} catch (IOException e) {e.printStackTrace();}
​// 从文件中加载用户对象try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("user.ser"))) {User loadedUser = (User) inputStream.readObject();System.out.println("Loaded user: " + loadedUser);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

在这个示例中,我们定义了一个 User 类,其中包含了用户名、密码和邮箱字段。我们使用 transient 关键字将这些字段标记为不可序列化。然后,我们在类中重写了 writeObjectreadObject 方法,手动控制了序列化和反序列化过程,只序列化了需要的字段。

这个示例演示了如何使用 ObjectStreamField 类自定义序列化和反序列化过程,以便更灵活地控制对象的序列化行为。

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

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

相关文章

电子印章系统怎么盖骑缝章?

随着数字化时代的不断发展&#xff0c;电子印章系统在各行各业中得到了广泛应用。其中&#xff0c;骑缝章作为一种常见的复杂印章形式&#xff0c;也在电子印章系统&#xff0c;也额外被读者所关注。电子骑缝章的盖章过程相较于传统的纸质印章&#xff0c;更加简便快捷&#xf…

C++单元测试工具——googletest

在平常的学习和工作中&#xff0c;单元测试是很重要的一环&#xff0c;用于验证代码中最小的可测试单元&#xff08;通常是函数或方法&#xff09;是否按照预期工作&#xff0c;单元测试可以帮助开发人员验证代码的正确性和提高代码的可维护性&#xff0c;确保代码的稳定性和可…

综合服务 IntServ

目录 综合服务 IntServ IntServ 定义的两类服务 IntServ 的四个组成部分 流 (flow) 资源预留协议 RSVP RSVP 协议的工作原理 IntServ 体系结构在路由器中的实现 综合服务 IntServ 体系结构存在的主要问题 综合服务 IntServ 综合服务 IntServ (Integrated Services) 可…

力扣随笔删除有序数组中的重复项(简单26)

思路&#xff1a;根据类似于滑动窗口的思想&#xff0c;定义一个指针&#xff1b;使指针左边的区域全部为不重复元素&#xff08;包括指针所指的数字&#xff09; 以示例2为例&#xff0c;left&#xff1a;红色加粗 遍历指针i&#xff1a;黑色加粗 窗口范围&#xff0c;左边界到…

区分服务 DiffServ

目录 区分服务 DiffServ 区分服务的基本概念 区分服务 DiffServ 的要点 每跳行为 PHB DiffServ 定义的两种 PHB 区分服务 DiffServ 区分服务的基本概念 由于综合服务 IntServ 和资源预留协议 RSVP 都较复杂&#xff0c;很难在大规模的网络中实现&#xff0c;因此 IET…

基于Prony算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Prony算法是一种用于信号处理和系统辨识的经典方法&#xff0c;特别适用于线性时不变系统&#xff08;LTI&#xff09;的频率响应分析以及模拟复指数信号序列。其…

golang通过http访问外部网址

不同项目之前,通过http访问,进行数据沟通 先设定一个接口,确认外部能访问到 PHP写一个接口 public function ceshi_return() {$data $this->request->param();$id $data[id];$res Db::name(user)->field(id,status,price,name)->where([id>$id])->find…

无人集群试验评估现状及技术方法综述

源自&#xff1a;系统工程与电子技术 作者&#xff1a;赵蕊蕊, 于海跃, 游雅倩, 张涛, 陶敏, 姜江 “人工智能技术与咨询” 发布 摘 要 试验评估是促进装备系统作战能力生成和实战化应用的重要手段。无人集群依靠自组网实现复杂交互, 具备典型的智能性和涌现性, 开展无人集…

深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息&#xff1a;International Journal of Multiphase Flow 2023 级别&#xff1a;EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&q…

VSCode远程开发 Windows11 Linux

问题背景 之前一直用JetBrains的Gateway和本地Linux虚拟机开发&#xff0c;不过笔记本配置不够&#xff0c;太卡了。最近租了个国外的便宜服务器&#xff0c;JetBrains的Gateway总断连&#xff0c;也不知道为什么&#xff0c;所以试试VSCode。 本地 Windows 11 &#xff0c;远…

matlab新能源汽车三自由度操纵稳定性分析及优化

1、内容简介 略 可以交流、咨询、答疑 55-新能源汽车三自由度操纵稳定性分析及优化 2、内容说明 略 摘 要 电动化是节能减排、寻求替代能源的最佳途径&#xff0c;已成为行业共识&#xff0c;论文基于江西科技学院桑塔纳轿车油改气项目&#xff0c;在拆除发动机、变速…

一键生成请求方法的工具 —— OpenAPI Typescript Codegen

文章目录 用法自定义请求参数的方法1&#xff09;使用代码生成器提供的全局参数修改对象2&#xff09;直接定义 axios 请求库的全局参数&#xff0c;比如&#xff1a;全局请求响应拦截器 报错解决 用法 首先下载axios npm install axios官网&#xff1a;https://github.com/f…

Linux运维- FTP服务器

FTP服务器的配置与管理 项目场景 学院教职工在日常工作中&#xff0c;经常需要传送一些文件和资料。可以使用移动存储设备转存再复制&#xff0c;或者通过共享文件的方式实现&#xff0c;但是两种方法都不是很简单、方便。相对于这两种方法&#xff0c;使用FTP传送文件和资料…

【电子通识】为什么单片机芯片上会有多组VDD电源?

在单片机芯片规格书中&#xff0c;我们经常能看到多个组VDD的设计&#xff0c;如下红框所示管脚都是VDD管脚。 为什么需要这样设计&#xff1f;只设置一个VDD管脚&#xff0c;把其他的VDD管脚让出来多做几个IO或是其他复用功能不好吗&#xff1f;接下来我们从单片机内部的电路结…

阿里云-系统盘-磁盘扩容

阿里云系统磁盘扩容 之前是测试环境磁盘用的默认的有 40G&#xff0c;后面升级到正式的 磁盘怕不够用打算升级到 100G&#xff0c; 系统镜像&#xff1a; Alibaba Cloud Linux 3.2104 LTS 64 位 磁盘 ESSD 40G 升级步骤&#xff1a; 扩容与创建快照 在阿里云后台首先去扩容…

域名系统与IP地址分配

域名 域名的概述 域名是一个逻辑的概念&#xff0c;它不反映主机的物理地点 域名结构 由于数字形式的IP地址难以记忆和理解&#xff0c;为此人们采用英文符号来表示IP地址&#xff0c;这就产生了域名&#xff0c;域名长度不超过255各字符&#xff0c;每一层域名长度不超过6…

旅游组团自驾游拼团系统 微信小程序python+java+node.js+php

随着社会的发展&#xff0c;旅游业已成为全球经济中发展势头最强劲和规模最大的产业之一。为方便驴友出行&#xff0c;寻找旅游伙伴&#xff0c;更好的规划旅游计划&#xff0c;开发一款自驾游拼团小程序&#xff0c;通过微信小程序发起自驾游拼团&#xff0c;吸收有车或无车驴…

爬虫入门五(Scrapy架构流程介绍、Scrapy目录结构、Scrapy爬取和解析、Settings相关配置、持久化方案)

文章目录 一、Scrapy架构流程介绍二、Scrapy目录结构三、Scrapy爬取和解析Scrapy的一些命令css解析xpath解析 四、Settings相关配置提高爬取效率基础配置增加爬虫的爬取效率 五、持久化方案 一、Scrapy架构流程介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取…

Kotlin:协程基础

点击查看&#xff1a;协程基础 中文文档 点击查看&#xff1a;协程基础 英文文档 第一个协程程序 import kotlinx.coroutines.*fun main(){GlobalScope.launch {delay(1000L)//delay 是一个特殊的 挂起函数 &#xff0c;它不会造成线程阻塞&#xff0c;但是会 挂起 协程&…