3

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

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

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

注意:myObject有一个很深的参考层次结构,这使得手动查找罪魁祸首变得非常乏味。

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

4

4 回答 4

1

如果你想以编程方式检查哪个实例字段没有实现可序列化使用反射。获取该类的所有字段。现在遍历它并检查它是否是 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());
     }
  }

}

请注意,如果您不想序列化它,也可以将变量标记为瞬态。因此,如果您不想序列化它,则每个实例变量都不必是可序列化的类型。

于 2013-06-04T11:02:28.613 回答
0

异常本身会告诉您哪些类不可序列化。

于 2013-06-04T11:04:13.803 回答
0

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

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

他们将区分其他行的相同异常

于 2013-06-04T11:05:44.597 回答
0

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

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

您可以对此进行二进制搜索,一次测试每一半,然后测试子半,直到找到它。

于 2013-06-04T11:08:29.417 回答