2013-06-04 32 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關鍵字告訴序列化庫不序列化標有它的字段。

你可以二進制搜索這個,一次測試所有的一半,然後是子半部分,直到你找到它。