2012-06-04 21 views
0

所以这是我的问题。通过ObjectStream序列化问题发送/接收

我有一个客户端和一个服务器java程序。 每个人都建立并管理另一个ObjectInputStream/ObjectOutputStream。

我希望能够发送对象(鉴于所有发送的对象将扩展我创建的数据包类)。 的问题是,即使客户端和服务器可能对包类完全相同的代码,我得到一个错误:

java.lang.ClassNotFoundException: shared.Packet0Connect 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at java.io.ObjectInputStream.resolveClass(Unknown Source) 
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at com.mooman219.gmail.server.ReceivePacketThread.run(ReceivePacketThread.java:19) 

看来,Java会把该服务器上的数据包类是不同的在客户端上课。

有没有一种方法可以解决这个问题(除了在客户端和服务器上都有相同的包名)?

回答

2

数据传输对象类必须是相同的类 - 它们必须具有相同的完全限定类名(即相同的包名和相同的类名),而不仅仅是相同的内容。

序列化过程发出的字节流包括对象的全限定类名(以及超类的FQCN)。然后它还包含非暂时性,非静态字段的序列化版本(除非您使用其中一种钩子方法自定义了序列化过程)。

这里是一个example of the byte stream。请注意,在该示例中,该类位于默认(空)包中,这使得我们正在讨论的内容略显清晰。

+0

会有任何解决方法吗? –

+1

@Joe:为什么你不能使用完全一样的课程?你为什么要复制它的任何一端?这违反了[DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)。 –

+0

我想在两端都有完全相同的课程,只是在不同的包装中。 –