有没有办法检查对象是否可以在java中序列化?

时间:2013-11-29 12:53:52

标签: java

我发现当我浪费了很多时间来解决问题时,java中的Object class在java中是不可序列化的。
那么任何人都可以知道另一个类是不可序列化的以任何方式检查该类是否可序列化?

7 个答案:

答案 0 :(得分:9)

使用

if(someObj instanceof Serializable) // recommended because it uses 
                                    // the byte code instruction INSTANCEOF

if(Serializable.class.isInstance(someObj))

如果Class.isInstance(someObj)在运行时可以替换,则使用Class是有意义的。

例如:

Class<?> someClass == ....; // assign a class object reference dynamically
if(someClass.isInstance(someObj))

答案 1 :(得分:9)

仅使用instanceof不是100%可靠,如下面的代码所示。你最好的选择是检查你试图编组的课程来源,如果你有,或者,如果没有,你可能希望 班级供应商做对了。

class A {
    final int field;



/*
// uncomment this ctor to make class "more" serializable
    A()  {
        this.field = -1;
    }
*/


    A(int field) {
        this.field = field;
    }
}

class B extends A implements Serializable {

    B(int field) {
        super(field);
    }

    public String toString() {
        return "B{field=" + field + "}";
    }
}

class Test {
    public static void main(String[] args) {
        System.out.println(Serializable.class.isAssignableFrom(B.class));

        B b = new B(11);

        try {
            ByteArrayOutputStream bf = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bf);
            oos.writeObject(b);
            oos.close();

            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bf.toByteArray()));
            Object o = ois.readObject();
            System.out.println(o.toString());
        } catch (Exception e) {
            System.out.println("Not exactly Serializable");
            e.printStackTrace();
        }

    }
}

答案 2 :(得分:2)

if (yourObjectInstance instanceof Serializable) {
    // It is
} else {
    // It is not
}

请注意,如果yourObjectInstancenull,则else部分null部分不会Serializable,无论参考的类别是什么

同样as Victor Sorokin points out,让一个类实现Serializable并不意味着它实际上可以被序列化。

答案 3 :(得分:2)

有人建议使用 instanceof 运算符,但它会做另一件事:如果引用为空则返回false ,即使该类实现了Serializable! 这也适用于Class.isInstance(Object obj)

答案 4 :(得分:2)

如果对象是可序列化的,则应该能够将其转换为字节数组。 因此,您可以使用此测试方法,并确保在序列化该方法时不会抛出异常。

@Test
public void testIfYourClassIsSerilaizable()  {

    boolean exceptionThrown = false;
    try {
        YourClass obj = new YourClass();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        byte [] data = bos.toByteArray();

    } catch(IOException ex) {
        exceptionThrown = true;
    }
    Assert.assertFalse(exceptionThrown);
}

因此,基于此,如果YourClass或其属性未实现Serializable,则上述测试将引发异常,从而使该类不可序列化。

答案 5 :(得分:0)

您可以查看

someObject instanceof Serializable

如果true实现someObject接口

,这将评估为Serializable

答案 6 :(得分:0)

你可以检查班级是否可序列化:

if(someObj instanceof Serializable)