服务器发送的对象客户端读取反序列化失败?

各位大大,请教问题:在写一个带大厅和房间的小型网络游戏。初写……只能用各种最笨的办法。在写我的大厅和房间时,只有大厅里有一个收集客户端的容器。每一条消息,是包在一个我自己... 各位大大,请教问题:
在写一个带大厅和房间的小型网络游戏。初写……只能用各种最笨的办法。
在写我的大厅和房间时,只有大厅里有一个收集客户端的容器。每一条消息,是包在一个我自己写的类(MyObject implements Serializable)里面。所有与服务器之间的通讯的对象都继承自这个类。这个类里面有标识这些消息发自客户端所处位置(大厅,房间)的属性。
目前处于修改阶段,所以暂且是每条服务器发送给客户端的消息都是发送给所有客户端,由客户端 接收以后 自己判断是否与自己所处位置(大厅,房间)符合,决定是否执行。
大厅为一个线程,当客户端发送来消息说离开大厅进入某一个房间时,判断对应房间是否建立,若没有建立,则新建线程并且启动。目前出现的问题是,在大厅里所有通讯全部正常,而当转到房间的时候(其实一切都没有变化,只是在另外一个线程里面),读取从服务器发送来的对象出错。本来是MyObject mo=(MyObject)(ois.readObject());报“java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to othello.Other.MyObject”,然后改作Object o=ois.readObject();再打印对象o的类名,打印如下:

oInPLrun in PlayGame Receive Class is class java.io.ObjectStreamClass
oInPLrun in PlayGame Receive Class is class java.lang.String
oInPLrun in PlayGame Receive Class is class java.lang.String
oInPLrun in PlayGame Receive Class is class java.lang.String
oInPLrun in PlayGame Receive Class is class java.lang.String
java.io.EOFException
EOFException in PlayGame receive()...
at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2722)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1728)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at othello.gui.ingame.PlayGame$Receive.run(PlayGame.java:2427)//自己写的PlayGame类中的Receive()用于从流读取对象
at java.lang.Thread.run(Thread.java:619)

查了API,发现ObjectStreamClass是序列化的标志头,应该是说我的对象被拆散了,也就是说我序列化的对象被拆散成了好几个对象发过来。请问各位大侠,这是为什么呢?
在下不胜感激!
展开
 我来答
二頁書
2010-05-11 · 超过24用户采纳过TA的回答
知道答主
回答量:80
采纳率:0%
帮助的人:55.3万
展开全部
我看了一下jdk文档,上面有关ObjectInputStream的描述:
[jdk文档]
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
[jdk文档]

从上面可以看到是对基本数据类型序列化和反序列化,String及数组等不是基本数据类型
[jdk文档]
在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。

readObject 方法负责使用通过对应的 writeObject 方法写入流的数据,为特定类读取和恢复对象的状态。该方法本身的状态,不管是属于其超类还是属于其子类,都没有关系。恢复状态的方法是,从个别字段的 ObjectInputStream 读取数据并将其分配给对象的适当字段。DataInput 支持读取基本数据类型。

尝试读取由对应的 writeObject 方法写入的超出自定义数据边界的对象数据将导致抛出 OptionalDataException(eof 字段值为 true)。超出已分配数据末尾的非对象读取以指示流末尾的方式反映数据结束:按位读取与字节读取或字节数读取一样,将返回 -1,基元读取将抛出 EOFException。

[jdk文档]
读取对象类似于运行新对象的构造方法。为对象分配内存并将其初始化为零 (NULL)。为不可序列化类调用无参数构造方法,然后从以最接近 java.lang.object 的可序列化类开始和以对象的最特定类结束的流恢复可序列化类的字段。

从上面看,反序列化时读出的数据皆为基本数据类型,然后可能要自己重新组合成为你要的MyObject类型,如
String name = (String)ois.readObject();
int age = (int)ois.readInt();
MyObject mo = new MyObject();
mo.setName(name);
mo.setAge(age);

我的理解不知道对不对
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式