我的需求是这样的,服务器端有个xml配置文件,我要传给客户端去处理,我们用的是dom4j,于是我传递Document对象给客户端,让客户端自己去处理然后把这个对象再传回来给我。
我自己测试了传递自己定义的普通类,实现序列化,可以传递,很正常,但是传递dom4j的Document对象就不行了,出现EOFException异常。按道理说如果Document对象如果没有实现序列化的话应该是抛出NotSerializableException才对。
昨天跟同事搞了一天了没有解决,今天来这里求解了,希望看到的大侠帮忙分析下这是什么情况造成的,如何解决才能传递这个Document对象。下面是异常信息。
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.io.EOFException
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy0.getXMLDocument(Unknown Source)
at rmi_tset.Client.test2(Client.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)
... 20 more

解决方案 »

  1.   

    你可以把Document转化成byte[]数组,再用ByteArrayOutputStream流传输就可以了
      

  2.   

    File file = new File(fileName);byte buffer[] = new byte[(int) file.length()];把buffer[]传给客户端转成XML
    客户端操作XML后则传给服务器端oK 
      

  3.   


    byte[]数组如何再转换成Document对象呢?
      

  4.   

    虽然有点麻烦   可以先把Document转化成byte[]数组,然后在客户端把byte[]数组写入文件中,读取那个文件,创建document对象就可以了