ObjectStreamClass:监视Java对象的序列化

ObjectStreamClass可以是有用的类,用于分析JVM中加载的序列化类的序列化特征。 这篇文章介绍了此类提供的有关已加载序列化类的一些信息。

ObjectStreamClass提供了两个用于查找类的静态方法: lookup(class)和lookupAny(Class) 。 第一个lookup(Class)仅在提供的类可序列化时返回ObjectStreamClass的实例,如果提供的类不可序列化则返回null。 第二个方法lookupAny(Class)返回所提供类的ObjectStreamClass实例,而不管其是否可序列化。

一旦通过静态“ lookup”方法提供了ObjectStreamClass实例,就可以查询该实例的类名 , 序列号UID和可序列化的字段 。

为了演示ObjectStreamClass用法,我首先列出了两个简单类的代码清单,它们将是演示的一部分。 一类Person是可序列化的 ,但具有一个过渡字段。 另一个类UnserializablePerson几乎相同,但不可序列化。

人.java

package dustin.examples.serialization;import java.io.Serializable;/*** Person class intended for demonstration of ObjectStreamClass.* * @author Dustin*/
public class Person implements Serializable
{private final String lastName;private final String firstName;transient private final String fullName;public Person(final String newLastName, final String newFirstName){this.lastName = newLastName;this.firstName = newFirstName;this.fullName = this.firstName + " " + this.lastName;}public String getFirstName(){return this.firstName;}public String getLastName(){return this.lastName;}public String getFullName(){return this.fullName;}@Overridepublic String toString(){return this.fullName;}
}

UnserializablePerson.java

package dustin.examples.serialization;/*** Person class intended for demonstration of ObjectStreamClass.* * @author Dustin*/
public class UnserializablePerson
{private final String lastName;private final String firstName;private final String fullName;public UnserializablePerson(final String newLastName, final String newFirstName){this.lastName = newLastName;this.firstName = newFirstName;this.fullName = this.firstName + " " + this.lastName;}public String getFirstName(){return this.firstName;}public String getLastName(){return this.lastName;}public String getFullName(){return this.fullName;}@Overridepublic String toString(){return this.fullName;}
}

现在有了两个可以与ObjectStreamClass结合使用的类,现在该看看一个简单的演示应用程序,该应用程序演示ObjectStreamClass使用。

ObjectStreamClassDemo.java

package dustin.examples.serialization;import static java.lang.System.out;import java.io.ObjectStreamClass;
import java.io.ObjectStreamField;/*** Demonstrates use of ObjectStreamDemo.* * @author Dustin*/
public class ObjectStreamClassDemo
{/*** Displays class name, serial version UID, and serializable fields as* indicated by the provided instance of ObjectStreamClass.* * @param serializedClass */public static void displaySerializedClassInformation(final ObjectStreamClass serializedClass){final String serializedClassName = serializedClass.getName();out.println("Class Name: " + serializedClassName);final long serializedVersionUid = serializedClass.getSerialVersionUID();out.println("serialversionuid: " + serializedVersionUid);final ObjectStreamField[] fields = serializedClass.getFields();out.println("Serialized Fields:");for (final ObjectStreamField field : fields){out.println("\t" + field.getTypeString() + " " + field.getName());}}/*** Main function that demonstrates use of ObjectStreamDemo.* * @param arguments Command line arguments; none expected.*/public static void main(String[] arguments){// Example 1: ObjectStreamClass.lookup(Class) on a Serializable classout.println("\n=== ObjectStreamClass.lookup(Serializable) ===");final ObjectStreamClass serializedClass = ObjectStreamClass.lookup(Person.class);displaySerializedClassInformation(serializedClass);// Example 2: ObjectStreamClass.lookup(Class) on a class that is not//            Serializable (which will result in a NullPointerException//            when trying to access null returned from 'lookup'out.println("\n=== ObjectStreamClass.lookup(Unserializable) ===");try{final ObjectStreamClass unserializedClass =ObjectStreamClass.lookup(UnserializablePerson.class);displaySerializedClassInformation(unserializedClass);}catch (NullPointerException npe){out.println("NullPointerException: Unable to lookup unserializable class with ObjectStreamClass.lookup.");}// Example 3: ObjectStreamClass.lookupAny(Class) works without the//            NullPointerException, but only provides name of the class as//            Serial Version UID and serialized fields do not apply in the//            case of a class that is not serializable.out.println("\n=== ObjectStreamClass.lookupAny(Unserializable) ===");final ObjectStreamClass unserializedClass =ObjectStreamClass.lookupAny(UnserializablePerson.class);displaySerializedClassInformation(unserializedClass);}
}

上面的源代码中的注释指示了正在演示的内容。 下一个屏幕快照中显示了运行此类的输出。

outputObjectStreamClassDemo

当上面显示的输出与之前的代码相关联时,我们可以进行一些与ObjectStreamClass相关的观察。 这些包括以下事实:可序列化类的transient字段未作为可序列化字段之一返回。 我们还看到,如果提供给它的类不可序列化,则ObjectStreamClass.lookup(Class)方法将返回null。 ObjectStreamClass.lookupAny(Class)对于无法序列化的类返回ObjectStreamClass的实例,但是在这种情况下,只有该类的名称可用。

上面的代码显示了1940442894442614965的Person.java的串行版本UID。当在命令行上运行 serialver时 ,将生成并显示相同的串行版本UID。

serialverOnPersonPowerShell

以编程方式计算与Oracle JDK附带的serialver工具所计算出的相同串行版本UID的功能的serialver在于,可以显式地将相同的串行版本UID添加到生成的代码中 ,而无论如何将其隐式添加。 任何需要了解类的隐式Serial Version UID的JVM友好脚本或工具(例如,用Groovy编写的脚本)或工具,都可以使用ObjectStreamClass来获取该Serial Version UID。

参考: ObjectStreamClass:在我们的Inspired by Actual Events博客中,从我们的JCG合作伙伴 Dustin Marx 看了Java对象的序列化 。

翻译自: https://www.javacodegeeks.com/2014/02/objectstreamclass-peeking-at-a-java-objects-serialization.html

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

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

相关文章

00005在java结果输出_Java-005-运算符详解

计算机的最基本用途之一就是执行数学运算,作为一门计算机语言Java也提供了套丰富的运算符来操纵变量, 可以把运算符分成以下几组算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其他运算符。①算术运算符用在数学表达式中它们的作用和在数学中的作用一样 表格中的…

鼠标拖动改变DIV等网页元素的大小的最佳实践

1.初次实现 1.1 html代码 <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en" lang"en"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>div change wid…

[WC2006]水管局长

水管局长 题目链接&#xff1a;https://www.luogu.org/problemnew/show/P4172#sub LCT 显然两个点的路径上的边最大要最小在该图最小生成树上 正删倒加&#xff0c;倒着做变成加边操作 加边时判断一下是否能形成更优的生成树&#xff0c;用LCT删除和连接操作即可 1 #include<…

JDBC 4.0鲜为人知的Clob.free()和Blob.free()方法

在会议上谈论jOOQ时&#xff0c;我总是展示此幻灯片&#xff0c;其中包含许多人们经常犯的非常常见的JDBC错误&#xff1a; 此图中的六个常见的JDBC错误 您可以找到错误吗&#xff1f; 其中一些是显而易见的&#xff0c;例如&#xff1a; 第4行&#xff1a;由于第3行的连接…

反沙箱——SetErrorMode

目录 1.前言 2.原理讲解 3.代码实现 4.参考 1.前言 利用SetErrorMode进行反沙箱的技术&#xff0c;在2010年就有被提出&#xff0c;但是之前搜了很久都没有相关内容&#xff0c;这里简单的说一下这个反沙箱的实现。反沙箱参考GandCrab5.2。 2.原理讲解 首先讲一下SetErrorMode这…

使用MyBatis和Spring构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创建…

codeforces 1136E-Nastya Hasn't Written a Legend

传送门&#xff1a;QAQQAQ 题意&#xff1a;有一个数组a和一个数组k&#xff0c;数组a一直保持一个性质&#xff1a;a[i 1] > a[i] k[i]。有两种操作&#xff1a;1&#xff0c;给某个元素加上x&#xff0c;但是加上之后要保持数组a的性质。比如a[i]加上x之后&#xff0c;a…

将Spring MVC RESTful Web服务迁移到Spring 4

1引言 Spring 4为MVC应用程序带来了一些改进 。 在这篇文章中&#xff0c;我将重点介绍宁静的Web服务&#xff0c;并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试这些改进。以下几点总结了本文的内容&#xff1a; 从Spring 3.2迁移到Spring 4.0 变化中的Response…

java scrollpane 设置透明_java swing 之 JScrollPane(滚动面板)的使用

/*** java swing 之JScrollPane面板* 在设置界面时&#xff0c;可能会遇到在一个较小的容器窗体中显示一个较大部分的内容&#xff0c;这时可以使用* JScrollPane面板&#xff0c;JscrollPane面板是带滚动条的面板&#xff0c;也是一种容器&#xff0c;但是常用于布置单个* 控件…

软件工程(2019)第三次个人作业

目录 软件工程第三次作业问题描述分析并设计程序程序流程图选择覆盖标准并设计测试样例软件工程第三次作业 项目地址 问题描述 题目(1)&#xff1a;最大连续子数组和&#xff08;最大子段和&#xff09; 背景 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组…

Flutter - 创建侧滑菜单

侧滑菜单在安卓App里面非常常见&#xff0c;比如Gmail&#xff0c;Google Play&#xff0c;Twitter等。看下图 网上也有很多创建侧滑菜单的教程&#xff0c;我也来记录一下&#xff0c;自己学习创建Drawer的过程。 1. 创建一个空的App import package:flutter/material.dart;cl…

java框架白话_Java NIO框架Netty教程(二) 白话概念

"Hello World"的代码固然简单&#xff0c;不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下&#xff0c;至少知道其是负责什。方便自己以后更灵活的使用和扩展。声明&#xff0c;笔者一介码农&#xff0c;不会那么多专业的词汇和缩写&#xff0c;只…

luogu4770 [NOI2018]你的名字 后缀自动机 + 线段树合并

其实很水的一道题吧.... 题意是&#xff1a;每次给定一个串\(T\)以及\(l, r\)&#xff0c;询问有多少个字符串\(s\)满足&#xff0c;\(s\)是\(T\)的子串&#xff0c;但不是\(S[l .. r]\)的子串 统计\(T\)本质不同的串&#xff0c;建个后缀自动机 然后自然的可以想到&#xff0c…

团队计划会议

跟航哥想了挺多要做什么&#xff0c;要完成什么&#xff0c;以什么为主要功能 提出了几个想法&#xff0c;并做了投票 最后决定一起做一个跑腿软件 最初的任务量&#xff1a; 跟航哥商量两个人一人负责两个模块 航哥负责管理员和下单 我负责接单跟其他琐碎的小功能 呐&#xff…

vue.js java php_准吗?Java程序员喜欢AngularJS,PHP程序员喜欢Vue.js!

编程语言与框架或者库之间有联系是很正常的事情&#xff0c;如果我们告诉你&#xff0c;使用某一种编程语言或技术的开发人员可能更喜欢某个框架&#xff0c;你会作何反应呢&#xff1f;Stack Overflow根据网站内最常访问的标签将开发人员分为多个组&#xff0c;并检查了每组每…

结构化日志:出错时你最想要的好朋友

目录 介绍什么是日志&#xff1f;Grab中日志的状况为什么改变&#xff1f;结构化日志支持不同格式的多写开发中类似生产环境的日志因果顺序但为什么要结构化记日志&#xff1f;原文&#xff1a;Structured Logging: The Best Friend You’ll Want When Things Go Wrong 介绍 在…

在vue项目中添加特殊字体

这里的特殊字体&#xff0c;指的是一般用户电脑未安装到本地的字体&#xff0c;要引入这样的字体&#xff0c;首先需要把字体文件下载下来。 就像上图这样的&#xff0c;ttf格式的&#xff0c;然后在项目里添加它。 然后我们在font.css里用font-face规则引入这个字体文件并命名…

使用Spring WS创建合同优先的Web服务

1引言 本文介绍了如何使用来实现和测试SOAP Web服务 Spring Web Services项目 。 本示例使用JAXB2进行&#xff08;取消&#xff09;编组。 为了开发服务&#xff0c;我将使用合同优先的方法&#xff0c;该方法首先定义服务合同&#xff0c;然后基于该合同实施服务。 本文分为…

转载 Net多线程编程—System.Threading.Tasks.Parallel

.Net多线程编程—System.Threading.Tasks.Parallel System.Threading.Tasks.Parallel类提供了Parallel.Invoke&#xff0c;Parallel.For&#xff0c;Parallel.ForEach这三个静态方法。 1 Parallel.Invoke 尽可能并行执行所提供的每个操作&#xff0c;除非用户取消了操作。 方法…

Fiddler教程--简介

1、开发环境host配置自己修改系统的host来回挺麻烦的 2、前后的接口调试 3、线上bugfix 4、性能分析和优化 5.等等... 工作原理 一个代理服务器地址改为 127.0.0.1:8888流模式边走边返回缓冲模式http请求完成所有的数据之后&#xff0c;才返回 界面功能介绍 1.工具栏 从下图红色…