2013-03-01 66 views
2

我想在JavaFX 2項目中使用Java RMI發送對象,但是當下面的代碼運行時它返回一個NotSerializableException。RMI JavaFX 2 - NotSerializableException錯誤

我的Admin類是可序列化的,超級類也是如此。但是,它似乎是指向Admin類中的JavaFX SimpleIntegerProperty字段的例外。

我不知道該從這裏做什麼,因爲通過RMI發送的類是可序列化的。任何幫助非常感謝。

ObservableList<Admin> data = null; 
try 
{ 
    data = FXCollections.observableArrayList(Main.docServer.getAllAdmins()); 
} 
catch (RemoteException e) 
{ 
    e.printStackTrace(); 
} 

錯誤我收到:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javafx.beans.property.SimpleIntegerProperty 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:191) 
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) 
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) 
at $Proxy0.getAllAdmins(Unknown Source) 
at com.reece.doc.views.ViewAdmin.getContent(ViewAdmin.java:34) 
at com.reece.doc.ApplicationWindow.start(ApplicationWindow.java:32) 
at com.reece.doc.Main.start(Main.java:57) 
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) 
at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206) 
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) 
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javafx.beans.property.SimpleIntegerProperty 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at java.util.ArrayList.readObject(ArrayList.java:733) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173) 
... 10 more 
Caused by: java.io.NotSerializableException: javafx.beans.property.SimpleIntegerProperty 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) 
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
at java.util.ArrayList.writeObject(ArrayList.java:710) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975) 
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480) 
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292) 
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:332) 
at sun.rmi.transport.Transport$1.run(Transport.java:177) 
at sun.rmi.transport.Transport$1.run(Transport.java:174) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

回答

1

類通過RMI發送的序列化

若延續這只是序列化SerializableExternalizable所有的非靜態非瞬態成員變量也這樣做等遞歸直到關閉。在這種情況下,你顯然有javafx.beans.property.SimpleIntegerProperty類型,其作爲異常告訴你的一個不可序列化:

java.io.NotSerializableException: javafx.beans.property.SimpleIntegerProperty 

所以這是指它直接或間接的任何類,是不是序列化無論是。

+0

我將Serializable類中的字段更改爲Strings和ints,並在客戶端需要時創建Simple ***** Property,並使用getters作爲參數。不是最乾淨的代碼,但它的工作原理。謝謝。 – 2013-03-01 20:30:14

0

您可能標誌着一個成員變量不能被序列化。並添加到類新的int字段。

private int variableInt = 0; 

private transient IntegerProperty variable; 

public IntegerProperty variableProperty() 
{ 
    if(variable == null) 
    { 
     variable = new SimpleIntegerProperty(); 
     variable.set(variableInt); 
    } 
    return variable; 
} 

public void setVariable(int variable) 
{ 
    if(this.variable != null) 
     this.variable.set(variable); 
    variableInt = variable; 
} 

public int getVariable() 
{ 
    if(variable == null) 
     return variableInt; 
    else 
     return variable.get(); 
}