java.rmi.MarshalException,如何解决?

时间:2013-07-13 16:45:13

标签: java rmi

您好我正在使用netbeans编写RMI客户端和服务器程序。

我使用了Jsfml lib中使用的类(调用SoundBuffer)

当试图发送它的对象时,我得到了这个:

SEVERE: null
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
        java.io.NotSerializableException: org.jsfml.audio.SoundBuffer
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:156)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
        at $Proxy0.rsound(Unknown Source)
        at rmicallback.Client1ap.jButton5ActionPerformed(Client1ap.java:238)
        at rmicallback.Client1ap.access$400(Client1ap.java:30)
        at rmicallback.Client1ap$5.actionPerformed(Client1ap.java:113)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
        at java.awt.Component.processMouseEvent(Component.java:6504)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
        at java.awt.Component.processEvent(Component.java:6269)
        at java.awt.Container.processEvent(Container.java:2229)
        at java.awt.Component.dispatchEventImpl(Component.java:4860)
        at java.awt.Container.dispatchEventImpl(Container.java:2287)
        at java.awt.Component.dispatchEvent(Component.java:4686)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
        at java.awt.Container.dispatchEventImpl(Container.java:2273)
        at java.awt.Window.dispatchEventImpl(Window.java:2713)
        at java.awt.Component.dispatchEvent(Component.java:4686)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
        at java.awt.EventQueue.access$000(EventQueue.java:101)
        at java.awt.EventQueue$3.run(EventQueue.java:666)
        at java.awt.EventQueue$3.run(EventQueue.java:664)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
        at java.awt.EventQueue$4.run(EventQueue.java:680)
        at java.awt.EventQueue$4.run(EventQueue.java:678)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.io.NotSerializableException: org.jsfml.audio.SoundBuffer
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
        at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:151)
        ... 42 more

Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
        at java.lang.Object.wait(Native Method)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
        at sun.java2d.Disposer.run(Disposer.java:145)
        at java.lang.Thread.run(Thread.java:722)

当我尝试在服务器中调用一个参数类型SoundBuffer

的方法时 像这样:

 try {
            //org is type SoundBuffer 
            si.rsound(org, tag);
        } catch (RemoteException ex) {
            Logger.getLogger(Client1ap.class.getName()).log(Level.SEVERE, null, ex);
        }

因为我知道这是因为soundbuffer类没有序列化所以我怎么能这样做,或者我怎么能序列化对象(org type soundbuffer)

请告诉我该怎么做....谢谢。

1 个答案:

答案 0 :(得分:0)

如果你不能改变类使其成为Serializable,你将不得不使用其他东西。例如原始数据。