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);}
}
上面的源代码中的注释指示了正在演示的内容。 下一个屏幕快照中显示了运行此类的输出。
当上面显示的输出与之前的代码相关联时,我们可以进行一些与ObjectStreamClass
相关的观察。 这些包括以下事实:可序列化类的transient
字段未作为可序列化字段之一返回。 我们还看到,如果提供给它的类不可序列化,则ObjectStreamClass.lookup(Class)
方法将返回null。 ObjectStreamClass.lookupAny(Class)
对于无法序列化的类返回ObjectStreamClass
的实例,但是在这种情况下,只有该类的名称可用。
上面的代码显示了1940442894442614965的Person.java的串行版本UID。当在命令行上运行 serialver时 ,将生成并显示相同的串行版本UID。
以编程方式计算与Oracle JDK附带的serialver
工具所计算出的相同串行版本UID的功能的serialver
在于,可以显式地将相同的串行版本UID添加到生成的代码中 ,而无论如何将其隐式添加。 任何需要了解类的隐式Serial Version UID的JVM友好脚本或工具(例如,用Groovy编写的脚本)或工具,都可以使用ObjectStreamClass
来获取该Serial Version UID。
翻译自: https://www.javacodegeeks.com/2014/02/objectstreamclass-peeking-at-a-java-objects-serialization.html
ObjectStreamClass:监视Java对象的序列化相关推荐
- java对象的序列化和反序列化详细解释
java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...
- Java对象XML序列化框架-Simple2.0
Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如文件或是内存缓冲区等.在网络传输过程中,可以是字节或是 ...
- java 属性不序列化_怎样对带有不可序列化属性的Java对象进行序列化
原标题:怎样对带有不可序列化属性的Java对象进行序列化 出于很多原因我们想使用自定义的序列化方法取代Java默认的机制.一个最常见的原因是提高性能,而另一个原因是有时候我们无法使用默认的序列化方法. ...
- java对象的序列化机制详解
Java对象的序列化机制 Java对象的序列化,是将内存中的java对象转化为二进制的字节流,然后保存到磁盘中或者在网络上.这就是序列化对象,反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象. ...
- 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
- Java对象的序列化(Serialization)和反序列化详解
####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以 ...
- Java对象的序列化和反序列化
[感谢]孤傲苍狼的 Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行 ...
- 一文带你全面了解java对象的序列化和反序列化
本文分享自华为云社区<java中什么是序列化和反序列化?>,原文作者:dayu_dls . 这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍 ...
最新文章
- PyTorch 源码解读之 torch.serialization torch.hub
- 我为什么用ES做Redis监控,不用Prometheus或Zabbix?
- Dynamic Performance Tables not accessible 问题解决
- 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器将被洗牌
- 【Python基础入门系列】第06天:Python 模块和包
- 【Java】jdk 1.8 新特性——Lambda表达式
- c语言从1打印到100再打印到1该如何编写?
- kotlin 查找id_Kotlin程序查找Sphere的体积
- java注解和反射学习
- 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
- linux内容对齐的快捷键,linux第一波命令总结
- 固件攻击可在隐藏的SSD区域释放持久性恶意软件
- 外籍专家在中关村图书大厦解密软件项目
- SpringBoot2.x整合Redis数据库
- #include“stdafx.h”详解
- 【实战记录分析】目录导航
- 25行代码解决财务数据大写金额转换
- Swift SwiftUI 必备础库之 01 Introspect
- Java子线程异常及异常处理
- Adaptive Server Anywhere 数据库配置ODBC数据源
热门文章
- 2的负x次幂图像_数学| NO.2,3 函数 T15
- 关闭(杀死)8080端口
- mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
- 转-Redis AOF 持久化详解
- 编译报错+解决方法:错误: 找不到符号
- 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
- sql limit 子句_Java 8流中的常见SQL子句及其等效项
- ginkgo spi 错误_开发SPI时不要犯这个错误
- java中避免空指针_在Java中避免空检查
- 如何在不同的浏览器中设置Selenium网格以并行执行