【问题标题】:When Java class is instance of Serializable当 Java 类是 Serializable 的实例时
【发布时间】:2013-10-13 23:00:17
【问题描述】:

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

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

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;
    }

}

测试如下:

 File generatedFile = new File( GEN_OUTPUT_DIR, File.separator + className + ".java" );

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

结果表明我生成的类是 Serializable 的实例。我的问题是为什么?我认为如果它不实现 Serializable 它不应该是它的实例。我搜索了一个答案,但我找不到任何东西。

【问题讨论】:

    标签: java class junit instance serializable


    【解决方案1】:

    这是因为你在 Class 对象上调用了 instanceof,它是可序列化的。

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

    public final
    class Class<T> implements java.io.Serializable,
                              java.lang.reflect.GenericDeclaration,
                              java.lang.reflect.Type,
                              java.lang.reflect.AnnotatedElement 
    {
      ...
    }
    

    它显然是可序列化的。

    【讨论】:

    • 其他的都是对的。在他的测试中,他实例化了一个文件类型的对象,并检查该文件的实例是否是可序列化的。他不检查自己的实现
    • @cheffe : generatedFile.getClass() 返回一个 Class 对象。使用 instanceof 测试特定的 Class 对象。 instanceof 看到 Class,它是可序列化的,因此它返回 true。要测试文件是否可序列化,您需要输入generatedFile instanceof Serializable,而不是generatedFile.getClass() instanceof Serializable
    【解决方案2】:

    声明

    assertTrue( generatedFile.getClass() instanceof Serializable );
    

    正在返回true,因为这将检查此生成的文件对象的运行时类是否是Serializable 的实例。并且类对象是可序列化的。

    【讨论】:

      【解决方案3】:

      你这样做:

      File generatedFile = new File(...);
      

      这创建了File 类的实例

      generatedFile.getClass()
      

      这得到了File对象的Class对象,Class&lt;File&gt;类型的对象

      documentation of File 描述类:

      所有实现的接口:Serializable、Comparable

      如果你想解析一个java源文件,看看它是否实现了Serializable,你应该得到一个合适的工具,构建相关文件的抽象语法树,并提取信息从那里。

      或者你可以这样做,使用Class类的isAssignableFrom方法:

      public boolean checkSerializable(Class<?> classToCheck) {
          return Serializable.class.isAssignableFrom(classToCheck);
      }
      

      然后检查类本身:

      boolean isSerializable = checkSerializable(MyTestTableDto.class);
      

      【讨论】:

        【解决方案4】:

        从您的代码中,以下调用将返回 File 对象的类实例,而不是 MyTestTableDto

        generatedFile.getClass()
        

        (删除了错误的说法)

        【讨论】:

          猜你喜欢
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-28
          • 2023-03-07
          • 1970-01-01
          • 2023-03-08
          相关资源
          最近更新 更多