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

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

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

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

1.46 ObjectInputValidation

ObjectInputValidation 接口用于在读取对象时验证对象的有效性。在 ObjectInputStream 读取对象之后,如果读取的对象实现了 ObjectInputValidation 接口,则会调用其 validateObject() 方法来验证对象的有效性。如果 validateObject() 方法抛出 InvalidObjectException,则对象将被视为无效。

ObjectInputValidation 接口介绍:
所有字段:

ObjectInputValidation 接口没有字段。

构造方法:

ObjectInputValidation 接口没有构造方法,因为它是一个接口。

方法摘要:
  • void validateObject() throws InvalidObjectException:验证对象的有效性。

简单使用例子:

下面是一个简单的示例,演示了如何实现 ObjectInputValidation 接口以验证对象的有效性:

javaCopy code
import java.io.*;
​
public class ObjectInputValidationExample {
    static class Person implements Serializable, ObjectInputValidation {
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
​
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
​
        @Override
        public void validateObject() throws InvalidObjectException {
            if (age < 0) {
                throw new InvalidObjectException("Age cannot be negative");
            }
        }
​
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
​
    public static void main(String[] args) {
        String fileName = "person.ser";
        writeObjectToFile(fileName);
        readObjectFromFile(fileName);
    }
​
    private static void writeObjectToFile(String fileName) {
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {
            Person person = new Person("Alice", 30);
            outputStream.writeObject(person);
            System.out.println("Object written to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    private static void readObjectFromFile(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            Object obj = inputStream.readObject();
            if (obj instanceof Person) {
                Person person = (Person) obj;
                System.out.println("Object read from file: " + person);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,Person 类实现了 ObjectInputValidation 接口,并重写了 validateObject() 方法来验证对象的有效性。在 validateObject() 方法中,我们检查年龄是否为负数,如果是,则抛出 InvalidObjectException。在 main 方法中,我们先将一个 Person 对象写入文件,然后再从文件中读取该对象。由于 Person 类实现了 ObjectInputValidation 接口,因此在读取对象时会自动调用其 validateObject() 方法来验证对象的有效性。

应用场景

ObjectInputValidation 接口通常用于在反序列化对象时执行一些验证操作,以确保反序列化的对象的完整性和有效性。以下是一些可能的应用场景及相应的代码实现:

应用场景 1: 验证对象的版本信息
javaCopy code
import java.io.*;
​
public class VersionedObject implements Serializable, ObjectInputValidation {
    private static final long serialVersionUID = 1L;
​
    private int version;
​
    public VersionedObject(int version) {
        this.version = version;
    }
​
    @Override
    public void validateObject() throws InvalidObjectException {
        if (version != 1) {
            throw new InvalidObjectException("Invalid object version: " + version);
        }
    }
}
应用场景 2: 验证对象的某些属性是否有效
javaCopy code
import java.io.*;
​
public class ValidatedObject implements Serializable, ObjectInputValidation {
    private static final long serialVersionUID = 1L;
​
    private String name;
    private int age;
​
    public ValidatedObject(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    @Override
    public void validateObject() throws InvalidObjectException {
        if (age < 0 || age > 120) {
            throw new InvalidObjectException("Invalid age: " + age);
        }
        if (name == null || name.trim().isEmpty()) {
            throw new InvalidObjectException("Name cannot be null or empty");
        }
    }
}
应用场景 3: 对象签名验证
javaCopy code
import java.io.*;
​
public class SignedObject implements Serializable, ObjectInputValidation {
    private static final long serialVersionUID = 1L;
​
    private String data;
    private String signature;
​
    public SignedObject(String data, String signature) {
        this.data = data;
        this.signature = signature;
    }
​
    @Override
    public void validateObject() throws InvalidObjectException {
        // 在此处验证签名是否有效
        if (!verifySignature(data, signature)) {
            throw new InvalidObjectException("Invalid signature");
        }
    }
​
    private boolean verifySignature(String data, String signature) {
        // 实现签名验证逻辑
        return true; // 假设此处为验证通过
    }
}
应用场景 4: 对象完整性验证
javaCopy code
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
​
public class IntegrityCheckedObject implements Serializable, ObjectInputValidation {
    private static final long serialVersionUID = 1L;
​
    private String data;
    private String checksum;
​
    public IntegrityCheckedObject(String data, String checksum) {
        this.data = data;
        this.checksum = checksum;
    }
​
    @Override
    public void validateObject() throws InvalidObjectException {
        if (!verifyChecksum(data, checksum)) {
            throw new InvalidObjectException("Data integrity check failed");
        }
    }
​
    private boolean verifyChecksum(String data, String checksum) {
        // 计算数据的校验和并与提供的校验和进行比较
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(data.getBytes());
            String computedChecksum = bytesToHex(digest);
            return computedChecksum.equals(checksum);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return false;
        }
    }
​
    private static String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02x", b));
        }
        return result.toString();
    }
}

以上是一些使用 ObjectInputValidation 接口的应用场景和相应的代码实现。这些场景涵盖了从简单的对象属性验证到更复杂的对象签名和完整性验证。

实战例子

以下是一个项目实战例子,演示了如何在对象序列化和反序列化时使用 ObjectInputValidation 接口来验证对象的有效性:

javaCopy code
import java.io.*;
​
public class ObjectValidationExample {
    
    static class User implements Serializable, ObjectInputValidation {
        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;
        }
        
        @Override
        public void validateObject() throws InvalidObjectException {
            if (username == null || username.isEmpty()) {
                throw new InvalidObjectException("Username cannot be null or empty");
            }
            if (password == null || password.isEmpty()) {
                throw new InvalidObjectException("Password cannot be null or empty");
            }
        }
        
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    
    public static void main(String[] args) {
        String fileName = "user.ser";
        
        // 写入对象到文件
        writeObjectToFile(fileName);
        
        // 从文件读取对象并处理
        readObjectFromFile(fileName);
    }
    
    private static void writeObjectToFile(String fileName) {
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {
            User user = new User("john.doe", "password123");
            outputStream.writeObject(user);
            System.out.println("Object written to file successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void readObjectFromFile(String fileName) {
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(fileName))) {
            Object obj = inputStream.readObject();
            if (obj instanceof User) {
                User user = (User) obj;
                System.out.println("Object read from file: " + user);
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们定义了一个 User 类,该类实现了 Serializable 接口和 ObjectInputValidation 接口。在 User 类中,我们定义了两个字段 usernamepassword,并在 validateObject() 方法中验证了这两个字段的有效性。在 main 方法中,我们首先将一个 User 对象写入文件,然后再从文件中读取该对象。在读取对象时,validateObject() 方法会被自动调用来验证对象的有效性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错&#xff1a; >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考&#xff1a;https://github.com/conda/conda/issues/11079 方法一&#xf…

SQL-Labs靶场“1-5”关通关教程

君衍. 一、准备工作二、第一关 基于GET单引号字符型注入1、源码分析2、联合查询注入过程 三、第二关 基于GET整型注入1、源码分析2、联合查询注入过程 四、第三关 基于GET单引号变形注入1、源码分析2、联合查询注入过程 五、第四关 基于GET双引号字符型注入1、源码分析2、联合查…

JDBC核心技术

第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件

提高供应商收发文件效率的同时,如何保障数据的安全流转?

数据文件是制造业企业的核心竞争力&#xff0c;一旦发生数据外泄&#xff0c;就会给企业造成经济损失。之前就出现过像小米二级供应商因对其下游供应商管理不善&#xff0c;泄露了小米汽车前后保险杠的早期设计稿事件。制造业企业与供应商之间业务联系紧密&#xff0c;文件流转…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

AWK语言

一. awk awk&#xff1a;报告生成器&#xff0c;格式化输出。 在 Linux/UNIX 系统中&#xff0c;awk 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c;默认以空格或tab键作为分隔符作为分隔&#xff0c;并按模式或者条件执行编辑命令。而awk比较倾向于将一行…

预检请求:为跨域请求保驾护航(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python面向对象:什么是面向对象程序设计

编程范式 编程即写程序or代码&#xff0c;具体是指程序猿用特定的语法数据结构算法编写代码&#xff0c;目的是用来告诉计算机如何执行任务。 如果把编程的过程比喻为练习武功&#xff0c;那么编程范式指的就是武林中的各种流派&#xff0c;而在编程的世界里最常见的两大流派就…

numpy模块:从基础到高级的完整指南【第88篇—NumPy数组操作】

numpy模块&#xff1a;从基础到高级的完整指南 在Python的科学计算领域&#xff0c;NumPy模块是一个不可或缺的利器。它提供了丰富的数学函数和矩阵操作&#xff0c;使得数据处理、分析和科学计算变得更加高效。本文将带你初步了解NumPy模块&#xff0c;并通过实例代码深入解析…

JUC并发编程

JUC并发编程 JUC概述 JUC是java.util.concurrent包的简称&#xff0c;即Java并发编程工具包&#xff0c;目的是为了更好地支持高并发任务&#xff0c;让开发者进行多线程编程时有效减少竞争条件和死锁线程。 并发编程 一些基本概念&#xff1a; 进程与线程&#xff1a; 进…

C#,二叉搜索树(Binary Search Tree)的迭代方法与源代码

1 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;又称二叉查找树或二叉排序树。 一棵二叉搜索树是以二叉树来组织的&#xff0c;可以使用一个链表数据结构来表示&#xff0c;其中每一个结点就是一个对象。 一般地&#xff0c;除了key和位置…

基于 Python 深度学习的车辆特征分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

算法之力扣数青蛙

题目连接 文章目录 题目解析算法原理第一步第二步第三步第三步第四步指向o 代码讲解代码实现 题目解析 先给大家来讲解一下这个题目的意思吧&#xff0c;这个题目是说呢给你一个蛙叫的字符串让你去设计一个算法求出发出这种蛙叫最少需要几只青蛙。比如说第一个样例发出这种叫声…

端口号被占用怎么解决

1、快捷键"winR"打开运行&#xff0c;在其中输入"cmd"命令&#xff0c;回车键打开命令提示符。 2、进入窗口后&#xff0c;输入"netstat -ano"命令&#xff0c;可以用来查看所有窗口被占用的情况。 比如端口号为7680的端口被占用了&#xff0c…

Python入门:常用模块—logging模块

logging日志的分级&#xff1a; debug(),info(),warning(),error(),critical() 5个级别 最简单用法 1 2 3 4 import logging logging.warning("user [mike] attempted wrong password more than 3 times") logging.critical("server is down") 输出&…

【洛谷题解】P1601 A+B Problem(高精)

题目链接&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 题目难度&#xff1a;普及- 涉及知识点&#xff1a;高精度加法 题意&#xff1a; 分析&#xff1a;直接套用高精度加法模版即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std…

【搭建跨境电商独立站】跨境电商独立站的6大模式,任你选择!

在几年前跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好搭建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最适合…

LiveGBS流媒体平台GB/T28181功能-redis订阅国标设备状态redis订阅通道状态subscribe device操作及示例

支持Redis订阅国标设备状态及国标通道状态上线离线 1、设备状态监听的烦恼2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后 3.4、设备离线示例3.4.1、注…

批评openai

杨立昆对OpenAI的批评主要集中在几个方面。首先&#xff0c;他反驳了OpenAI首席科学家Ilya Sutskever关于AI可能已经拥有某种自主意识的观点。杨立昆认为&#xff0c;当前的神经网络并不具备这种特定宏架构&#xff0c;因此无法拥有自主意识。他强调&#xff0c;即使是最轻微的…

Stable Diffusion系列(六):原理剖析——从文字到图片的神奇魔法(潜空间篇)

文章目录 LDM概述原理模型架构自编码器模型扩散模型条件引导模型图像生成过程 实验结果指标定义IS&#xff08;越大越好&#xff09;FID&#xff08;越小越好&#xff09; 训练成本与采样质量分析不带条件的图片生成基于文本的图片生成基于语义框的图片生成基于语义图的图片生成…