2013-06-04 19 views
3

有没有办法列出里面myObject这是负责的java.lang.IllegalArgumentException: Non-serializable object例外的所有字段,如何找到哪个字段负责非Serialzable例外

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

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

注意:myObject有一个深层的参考层次,这将使它非常繁琐的通过它,并手动找到罪魁祸首。

编辑:我想以编程方式做到这一点。

+5

'myObject'本身如何? – BobTheBuilder

+0

我想你可以在异常堆栈跟踪中看到它。 –

+1

向我们展示异常stacktrace –

回答

0

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

试试下面though.Please忽略编译错误,因为我没有欠幅脉冲它

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

}

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

+0

这是我正在寻找的方法,但'Serializable.TYPE'部分似乎不起作用。 –

+0

它应该是Serializable.class。更新了我的帖子。 –

+0

这是非常错误的。回到前面。它应该是'Serializable.class.isAssignableFrom(field.getType())'。你根本不需要'myType'。 – EJP

0

异常本身告诉你什么类是不可序列化的。

0

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

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

他们将在其他线路

+0

'IllegalArgumentException'没有'getPosition()'方法。 – EJP

0

相同的异常区分如果异常消息不告诉你,你可以通过它搜索暂时使字段transient,直到你不再收到消息。

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

你可以二进制搜索这个,一次测试所有的一半,然后是子半部分,直到你找到它。