我发现当我浪费了很多时间来解决问题时,java中的Object class
在java中是不可序列化的。
那么任何人都可以知道另一个类是不可序列化的或以任何方式检查该类是否可序列化?
答案 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
}
请注意,如果yourObjectInstance
为null
,则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)