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,一经查实,立即删除!

相关文章

@Transcational特性

捕获RuntimeException捕获Error并不捕获Checked Exception在方法中使用Transcational注解时候,通过throw new Exception(),在发生异常的时候不会进行回滚,可以使用throw new RuntimeException()…

SpringBoot集成Thymeleaf前端模版

1、在application.properties配置文件中添加 thymeleaf 的配置信息 spring.datasource.driverClassNamecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/test spring.datasource.usernameroot spring.datasource.passwordrootspring.thymeleaf.modeHT…

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

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

spring data jpa 分页查询

法一&#xff08;本地sql查询,注意表名啥的都用数据库中的名称&#xff0c;适用于特定数据库的查询&#xff09; public interface UserRepository extends JpaRepository<User, Long> {Query(value "SELECT * FROM USERS WHERE LASTNAME ?1",countQuery &…

Python之递归

递归的意思是函数自己调用自己。递归次数&#xff1a;递归如果是死循环&#xff0c;最多执行999次。count0 def say():global countcount1print(say)print(count)say()say() #结果&#xff1a; # say # 1 # ... # say # 997 # say # RecursionError: maximum recursion depth e…

使用CDI的InjectionPoint注入配置值

依赖注入是用于组织类依赖的一项出色技术。 当前类中需要的所有类实例都是在运行时从DI容器提供的。 但是您的配置呢&#xff1f; 当然&#xff0c;您可以创建一个“ Configuration”类&#xff0c;并在需要它的任何地方注入该类&#xff0c;并从中获取必要的值。 但是CDI允许…

LOJ.6435.[PKUSC2018]星际穿越(倍增)

LOJBZOJ 参考这儿qwq。 首先询问都是求&#xff0c;向左走的最短路。\(f[i][j]\)表示从\(i\)走到\(j\)最少需要多少步。表示这样只会\(O(n^2\log n)\)的 但是感觉能卡过\(70\)分。 注意到从\(i\)出发&#xff0c;走\(j\)步能到达的点都是一段一段的。所以不妨令\(f[i][j]\)表示…

java setsession_Java Session.setServerAliveInterval方法代码示例

import com.jcraft.jsch.Session; //导入方法依赖的package包/类private Session startNewSession(boolean acquireChannel) throws JSchException, InterruptedException {Session newSession null;final AtomicBoolean cancelled new AtomicBoolean(false);ConnectingProgr…

鼠标拖动改变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这…

bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩

小编典典在极少数情况下&#xff0c;虚拟机可能会中止&#xff0c;即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况&#xff0c;例如在Unix上使用SIGKILL信号或在MicrosoftWindows上使用TerminateProcess调用。因此&#xff0c;不幸的是&#xff0c;我认为…

C89和C99区别--简单总结

&#xff08;1&#xff09;对数组的增强 可变长数组  C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可…

四、spring boot 1.5.4 日志管理

spring boot日志默认采用logback进行输出&#xff0c;你可以对logback进行定制化&#xff0c;方法如下&#xff1a; 在resources文件夹下建立logback.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- base.xml i…

使用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…

java打印word_Java jacob调用打印机打印word文档

前面说了Java如何生成复杂的Word文档&#xff0c;今年记录下Java如何调用打印机打印word文档。起初用的是自带的PrintJob&#xff0c;但是系统提供的打印机制并不成熟完整。网上的代码也是千篇一律&#xff0c;在我的打印设备Canon iR2525/2530 UFRII LT上&#xff0c;我能获取…

将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…

layui的富文本编辑器怎么赋值

除了上面讲的方法外&#xff0c;还可以使用layedit自带的方法赋值/*** 设置编辑器内容* param {[type]} index 编辑器索引* param {[type]} content 要设置的内容* param {[type]} flag 是否追加模式*/layedit.setContent(index, content, flag);flag是true&#xff0c;是追加模…