當我嘗試序列化Method對象時,出現此錯誤。可以使用Java對Method對象進行序列化?
java.io.NotSerializableException: java.lang.reflect.Method
任何想法?
當我嘗試序列化Method對象時,出現此錯誤。可以使用Java對Method對象進行序列化?
java.io.NotSerializableException: java.lang.reflect.Method
任何想法?
無法以便攜方式序列化方法對象,因爲它不包含恢復它的所有必需信息(例如字節碼)。
相反,您應該序列化類的名稱,方法名稱和參數類型。然後您可以在反序列化過程中重新創建Method
實例。
我用於解決此問題的解決方案:D – 2009-11-20 11:59:06
java.lang.reflect.Method
不執行java.io.Serializable
。所以它不能使用內置的Java方法進行序列化。
如何查看在java api上實現了哪些類。 – 2009-11-20 11:36:12
@MarcosRorizJunior在mlk鏈接到的Javadoc中,有一段說明如(用於Method),「**所有已實現的接口:** AnnotatedElement,GenericDeclaration,Member」。這些是類實現的接口。 – 2013-11-05 02:21:21
您可以手動完成。只需將您的類名,方法名和參數類名作爲字符串序列化,然後在反序列化過程中使用反射機制重新創建Method對象。
Class.forName(clsName).getMethod("methodName", Class.forName(param1ClsName), ....);
如果實現Externalizable接口,那麼你可以使用你的類作爲常規序列化類。
如果任何方法參數是基本類型(即int),這不起作用 – luke 2013-06-06 19:35:39
假設java.lang.reflect.Method
對象是另一個類的成員,則應將其標記爲transient,並在反序列化後使用類名稱和方法名稱/簽名重新創建它。
您可以爲此實現一個MethodInfo類。
class SerializableClass {
private transient Method m_method; //Not serialized
private MethodInfo m_methodInfo;
public Method getMethod() {
if(m_method != null) {
//Initailize m_method, based on m_methodInfo
}
return m_method;
}
}
urgh ...你爲什麼要這麼做? – skaffman 2009-11-20 11:23:51
你不應該試圖序列化一個方法,因爲它只是一個方法信息的句柄,它不是方法本身。你想做什麼? – 2009-11-20 23:02:29