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。

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

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

ObjectStreamClass:监视Java对象的序列化相关推荐

  1. java对象的序列化和反序列化详细解释

    java对象的序列化和反序列化是什么意思 1.序列化是干啥用的? 序列化的原本意图是希望对一个Java对象作一下"变换",变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结 ...

  2. Java对象XML序列化框架-Simple2.0

    Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...

  3. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如文件或是内存缓冲区等.在网络传输过程中,可以是字节或是 ...

  4. java 属性不序列化_怎样对带有不可序列化属性的Java对象进行序列化

    原标题:怎样对带有不可序列化属性的Java对象进行序列化 出于很多原因我们想使用自定义的序列化方法取代Java默认的机制.一个最常见的原因是提高性能,而另一个原因是有时候我们无法使用默认的序列化方法. ...

  5. java对象的序列化机制详解

    Java对象的序列化机制 Java对象的序列化,是将内存中的java对象转化为二进制的字节流,然后保存到磁盘中或者在网络上.这就是序列化对象,反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象. ...

  6. 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  7. Java对象的序列化(Serialization)和反序列化详解

    ####1.序列化和反序列化 序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以 ...

  8. Java对象的序列化和反序列化

    [感谢]孤傲苍狼的 Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行 ...

  9. 一文带你全面了解java对象的序列化和反序列化

    本文分享自华为云社区<java中什么是序列化和反序列化?>,原文作者:dayu_dls . 这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍 ...

最新文章

  1. PyTorch 源码解读之 torch.serialization torch.hub
  2. 我为什么用ES做Redis监控,不用Prometheus或Zabbix?
  3. Dynamic Performance Tables not accessible 问题解决
  4. 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器将被洗牌
  5. 【Python基础入门系列】第06天:Python 模块和包
  6. 【Java】jdk 1.8 新特性——Lambda表达式
  7. c语言从1打印到100再打印到1该如何编写?
  8. kotlin 查找id_Kotlin程序查找Sphere的体积
  9. java注解和反射学习
  10. 面试官系统精讲Java源码及大厂真题 - 47 工作实战:Socket 结合线程池的使用
  11. linux内容对齐的快捷键,linux第一波命令总结
  12. 固件攻击可在隐藏的SSD区域释放持久性恶意软件
  13. 外籍专家在中关村图书大厦解密软件项目
  14. SpringBoot2.x整合Redis数据库
  15. #include“stdafx.h”详解
  16. 【实战记录分析】目录导航
  17. 25行代码解决财务数据大写金额转换
  18. Swift SwiftUI 必备础库之 01 Introspect
  19. Java子线程异常及异常处理
  20. Adaptive Server Anywhere 数据库配置ODBC数据源

热门文章

  1. 2的负x次幂图像_数学| NO.2,3 函数 T15
  2. 关闭(杀死)8080端口
  3. mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
  4. 转-Redis AOF 持久化详解
  5. 编译报错+解决方法:错误: 找不到符号
  6. 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
  7. sql limit 子句_Java 8流中的常见SQL子句及其等效项
  8. ginkgo spi 错误_开发SPI时不要犯这个错误
  9. java中避免空指针_在Java中避免空检查
  10. 如何在不同的浏览器中设置Selenium网格以并行执行