如何查找哪个字段负责Non-Serializable异常

时间:2013-06-04 10:57:01

标签: java serialization

有没有办法列出myObject内负责java.lang.IllegalArgumentException: Non-serializable object异常的所有字段,

我知道这是objectOutputStream.writeObject(myObject);

据我所知,myObject内的所有对象引用都在实现Serializable接口。

注意:myObject有一个很深的参考层次结构,这样做会非常繁琐,无法通过手动找到罪魁祸首。

编辑:我想以编程方式执行此操作。

4 个答案:

答案 0 :(得分:0)

如果要以编程方式检查哪个实例字段未实现可序列化使用反射。获取该类的所有字段。现在迭代它并检查它是否是Serializable的实例。

请尝试下面的内容。请忽略编译错误,因为我没有扯过它

public static void main(String[] args) throws Exception {
  Object o = new X();

  for (Field field : o.getClass().getFields()) {
     if (!Serializable.class.isAssignableFrom(field.getType())) {
        System.out.println("Field " + field + " is not assignable from type " + o.getClass());
     }
  }

}

请注意,如果您不想将变量序列化,也可以将变量标记为瞬态变量。所以每个实例变量都不需要是可序列化的类型,只要你不想序列化它。

答案 1 :(得分:0)

异常本身告诉你哪个类不可序列化。

答案 2 :(得分:0)

我希望这可以帮助你,在catch块中

catch(IllegalArgumentException e)
{ 
Log.e("IllegalArgumentException",e.getMessage().toString());
 }

他们将区分其他行的相同例外

答案 3 :(得分:0)

如果异常消息没有告诉您,您可以通过暂时创建字段transient来搜索它,直到您不再收到消息为止。

transient关键字告诉序列化库不要序列化用它标记的字段。

你可以进行二进制搜索,一次测试每一半,然后测试一半,直到找到它为止。