2013-03-01 65 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(); 
}