为了传递对象,我在建立连接的时候用了ObjectOutputStream和ObjectInputStream,代码如下:
out=new ObjectOutputStream (s.getOutputStream());
out.flush();
in=new ObjectInputStream(s.getInputStream());
这种连接中用out.writeObject()可以传递String对象。
但是,我现在想要用它传递一种自己定义类的对象,类定义如下:
class test {
String name;
int a;
int b;
public test(String s,int i,int j) {
name=s;
a=i;
b=j;
}}
在对象初始化后,传递时提示出现NotSerializableException异常。
现在请问各位高手,如何才能实现test对象的传递?
注:Socket连接已经建立成功。
out=new ObjectOutputStream (s.getOutputStream());
out.flush();
in=new ObjectInputStream(s.getInputStream());
这种连接中用out.writeObject()可以传递String对象。
但是,我现在想要用它传递一种自己定义类的对象,类定义如下:
class test {
String name;
int a;
int b;
public test(String s,int i,int j) {
name=s;
a=i;
b=j;
}}
在对象初始化后,传递时提示出现NotSerializableException异常。
现在请问各位高手,如何才能实现test对象的传递?
注:Socket连接已经建立成功。
解决方案 »
- 非常经典的那本关于设计模式的书叫什么名?封面啥样啊?
- 求助 一个排序的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 看我编的代码 帮我解决下坦克移动闪屏问题 谢谢大家
- 通不过上载资源的身份验证
- -- * 求助 2011.11.7 * -- 关于 HttpClient 和 Cookie 的问题。
- ORACLE里一个字段是NUMBER型的,在ResultSet中可以直接用getString吗?
- 写Properties文件时的奇怪问题,高手请进~!
- 将两个class放于两个不同文件中,编译时出现问题!
- chm是什么格式
- 求救!..............
- 求助:
- 为什么答案是 2:2:1:1?
我有点不太明白。
现在已经可以传递了,但是又出了一个新的问题:
SocketServer端找不到SocketClient.test类的定义
这个问题如何解决?
我会加分的
而且在读取对象的时候使用了如下语句:
t = (test) in.readObject();
再次拜托,谢谢!
我在服务器端已经定义了这个类了,而且与Client端完全相同。to:humanity(总是偷窥 Java & XML) ,你说的:
serialVersionUID ... 保证 Socket 两端 使用的类 版本兼容 。
如何具体实现?
在test t = (test) in.readObject();之后
读取t的内容时出现ClassNotFoundException
class test implements java.io.Serializable{
byte name;
int a;
int b;
public test(byte s,int i,int j) {
name=s;
a=i;
b=j;
}
}
Object输入输出流的建立:
out=new ObjectOutputStream (s.getOutputStream());
out.flush();
in=new ObjectInputStream(s.getInputStream());我觉得问题的关键在这里:
在Client端,我用上述代码定义了一个test类,
在Server端,我也用上述代码定义了一个类。
但是,虽然两端类的定义是完全一样的,由于他们处于不同的工程中,
代码相同并不代表Server端可以识别Client端的test类;
所以在Client端发送test对象时,Server端会发出
ClassNotFoundException异常,找不到SocketClient.test类
你只要保证类的版本一样就可以,在服务端只是进行反序列化.你看是不是socket建立不成功,对象没有传过来
ClassCastException
如何消除?
写了一个小例子供楼主参考。对象:
public class TestObject implements java.io.Serializable {
public String getString(){
return "Hello World!";
}
}客户端
import java.io.ObjectOutputStream;
import java.net.Socket;public class ObjectClient { public static void main(String argv[]) throws Exception {
Socket s = new Socket("192.168.18.103", 14567);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(new TestObject());
oos.flush();
System.out.println("Send finished.");
}}服务端:
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ObjectServer {
public static void main(String arg[]) throws Exception {
int port = 14567;
ServerSocket socket = new ServerSocket(port);
System.out.println("Server is running on " + port);
System.out.println("Press [Ctrl+C] to abort");
while (true) {
Socket s = socket.accept();
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
TestObject to = (TestObject) ois.readObject();
String str = to.getString(); // use object passed from client
System.out.println(str + " from " + s.getInetAddress());
}
}
}
经过调试通过。
所指的代码为:
TestObject to = (TestObject) ois.readObject();
当然你可以选个小一点的延迟,不一定是3秒。import java.io.ObjectOutputStream;
import java.net.Socket;public class ObjectClient { public static void main(String argv[]) throws Exception {
Socket s = new Socket("192.168.18.103", 14567);
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(new TestObject());
oos.flush();
Thread.sleep(3000);
System.out.println("Send finished.");
}}
JVM并不认为他们相同,所以在反序列化的时候会出现异常
在不同机器上的时候注意防火墙的问题。