首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Java类是可序列化实例时

当Java类是可序列化实例时
EN

Stack Overflow用户
提问于 2013-10-07 11:28:26
回答 4查看 4.9K关注 0票数 5

我想知道什么时候Java类是可序列化的实例。如我所知,类只有在实现可序列化接口时才是可序列化的。我试图使用junit来生成实体类(从某种模板),并检查它是否可序列化。

生成的类(它不实现Serializable)如下所示:

代码语言:javascript
复制
package test;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.annotation.Generated;
import javax.persistence.Id;


@Entity
@Table( name = MyTestTableDto.TABLE_NAME )
public class MyTestTableDto 
{
    public static final String TABLE_NAME = "MY_TEST_TABLE";

    public static final String COLUMN_MY_ID_FIELD = "MY_ID_FIELD";
    public static final String FIELD_MY_ID_FIELD = "myIdField";

    @Id
    @Column( nullable = true, length = 14, name = COLUMN_MY_ID_FIELD )
    private Long myIdField;

    public Long getMyIdField()
    {
        return myIdField;
    }

    public void setMyIdField( Long aMyIdField )
    {
        this.myIdField = aMyIdField;
    }

}

测试如下:

代码语言:javascript
复制
 File generatedFile = new File( GEN_OUTPUT_DIR, File.separator + className + ".java" );

 assertTrue( generatedFile.getClass() instanceof Serializable ); //returns true

结果表明,我生成的类是Serializable的实例。我的问题是为什么?我认为如果它没有实现可序列化,它就不应该是它的实例。我寻找答案,但什么也找不到。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-07 11:37:38

你这样做:

代码语言:javascript
复制
File generatedFile = new File(...);

这创建了类实例 File

代码语言:javascript
复制
generatedFile.getClass()

这得到了Class对象的File对象,这是一个Class<File>类型的对象。

档案文件描述了这个类:

所有实现的接口:Serializable,可比较

如果您想要实现这样的目的,您需要解析一个java源文件,看看它是否实现了Serializable,您应该为此获得一个适当的工具,构建该文件的抽象语法树,并从中提取信息。

或者您可以这样做,使用isAssignableFrom类的班级方法:

代码语言:javascript
复制
public boolean checkSerializable(Class<?> classToCheck) {
    return Serializable.class.isAssignableFrom(classToCheck);
}

然后检查类本身:

代码语言:javascript
复制
boolean isSerializable = checkSerializable(MyTestTableDto.class);
票数 6
EN

Stack Overflow用户

发布于 2013-10-07 11:34:56

这是因为您调用instanceof对象,它是可序列化的。

getClass返回一个Class<T>对象,其中T是类的类型。因为Class被定义为

代码语言:javascript
复制
public final
class Class<T> implements java.io.Serializable,
                          java.lang.reflect.GenericDeclaration,
                          java.lang.reflect.Type,
                          java.lang.reflect.AnnotatedElement 
{
  ...
}

很明显它是可序列化的。

票数 3
EN

Stack Overflow用户

发布于 2013-10-07 11:35:55

声明

代码语言:javascript
复制
assertTrue( generatedFile.getClass() instanceof Serializable );

返回true,因为这将检查此generatedFile对象的运行时类是否是Serializable的实例。类对象是可序列化的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19223688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档