有关ObjectInputStream/ObjectInputStream和对象序列化问题

gnez_2008 2007-06-02 10:55:34
大概情况如下:我建立一服务器端和一个客户端之间的连接.,客户端连接到服务器端后,发
送十个类Tstr的对象实例.Tstr类内容如下:
class Tstr implements Serializable{//被传输的类
String ID;
}
服务器端侦听9999端口,收到客户端的socket连接后,不断的接收Tstr类的实例,并把它打印
在屏幕.我在客户端发送的十个Tstr的实例都是不一样的.但是在服务器端接收到的Tstr却
都是一样的内容.
服务器端的代码如下:
import java.io.*;
import java.net.*;
/*
* 服务器端,侦听9999端口,接收Tstr类的对象,并把它打印在屏幕
*/
public class Stemp {
public static void main(String[] args)
{
ServerSocket ser=null;
Socket so=null;
ObjectInputStream in=null;
ObjectOutputStream out=null;
Tstr mer=null;
try{//侦听端口9999
ser=new ServerSocket(9999);
so=ser.accept();
out=new ObjectOutputStream(so.getOutputStream());
in=new ObjectInputStream(so.getInputStream());
}
catch(IOException e){}

while(true){//循环接收Tstr类的实例并把它打印在屏幕
try{
mer=(Tstr)in.readObject();
System.out.println(mer.ID);
}
catch(IOException ex){}
catch(ClassNotFoundException ex){}
}
}
}
class Tstr implements Serializable{//被传输的类
String ID;
}

------------------------------------------------------------------------------
-
客户端的代码如下:
import java.net.*;
import java.io.*;
import java.io.IOException;
/*
* 客户端,连接服务器,并发送十个Tstr类的实例
*/

public class Temp {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Socket socket=null;
ObjectInputStream in=null;
ObjectOutputStream out=null;

try{//建立socket连接,连接到服务器
socket=new Socket("localhost",9999);
in=new ObjectInputStream(socket.getInputStream());
out=new ObjectOutputStream(socket.getOutputStream());

}
catch(IOException e){System.out.println(e);}
Tstr merinfo=new Tstr();
for(int i=0;i<10;i++){//向服务器端发送十个Tstr类的实例
merinfo.ID="ID"+i;
try{
System.out.println("ID:"+merinfo.ID);
out.writeObject(merinfo);
}
catch(IOException ex){System.out.println(ex);}
}
}

}
------------------------------------------------------------------------------
-
然后客户端的输出如下:
ID:ID0
ID:ID1
ID:ID2
ID:ID3
ID:ID4
ID:ID5
ID:ID6
ID:ID7
ID:ID8
ID:ID9
服务器端的输出如下:
ID0
ID0
ID0
ID0
ID0
ID0
ID0
ID0
ID0
ID0

我想,服务器端的输出应该是这样子的啊:
ID0
ID1
ID2
ID3
ID4
ID5
ID6
ID7
ID8
ID9
为什么不是这样呢?
...全文
241 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-06-03
  • 打赏
  • 举报
回复
//Tstr merinfo=new Tstr();
for(int i=0;i<10;i++){//向服务器端发送十个Tstr类的实例
Tstr merinfo=new Tstr();//把对象声明写在这里,既每次都new 一个对象
merinfo.ID="ID"+i;
try{
System.out.println("ID:"+merinfo.ID);
out.writeObject(merinfo);
}
catch(IOException ex){System.out.println(ex);}
}
assre 2007-06-03
  • 打赏
  • 举报
回复
http://java.sun.com/developer/technicalArticles/Programming/serialization/有一段:

Caching Objects in the Stream
....................................

大意是说, merinfo写过一次後, 即使它的数据有改变, 被发送的数据还是和第一次发送时候一样的。 所以, 要new一个Tstr类, 或者, 每次out.writeObject(merinfo);後再调用 out.reset();,这样,数据就会重写。
MON_KEY2007 2007-06-02
  • 打赏
  • 举报
回复
你把Tstr 类里面的属性类型改为BufferString 看看
另外,建议你对类的属性读写的使用使用BEAN,也就是说赋值的时候用set方法
获取值的时候用get方法
gnez_2008 2007-06-02
  • 打赏
  • 举报
回复
另外,我试过重写Tstr类的hashCode()方法和equals()方法,但是结果还是那样子.

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧