我现在需要服务端去查询数据库,得到一个Enumeration<>对象,然后该对象通过objetctOutputStream的对象传给客户端,为了序列化,我写了一个NetTransfer类。代码如下
public class NetTransfer implements Serializable {
Object obj;
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
服务端代码如下:
public static void getAllUser()
{
try
{
//服务器开始在数据库查询
Vector<User> userVec=new Vector<User>();
rSet=stmt.executeQuery("select * from userdata");
while(rSet.next())
{
//以下只是我的程序中有不同类型的人,此处为多态
switch (rSet.getString("role")) {
case "administrator":
userVec.add(new Administrator(rSet.getString("name"), rSet.getString("password"), rSet.getString("role")));
break;
case "operator":
userVec.add(new Operator(rSet.getString("name"), rSet.getString("password"), rSet.getString("role")));
break;
case "browser":
userVec.add(new Browser(rSet.getString("name"), rSet.getString("password"), rSet.getString("role")));
break;
default:
break;
}
}
Enumeration<User> e = userVec.elements();
NetTransfer allUsers=new NetTransfer();
allUsers.setObj(e);
ObjectOutputStream oos=new ObjectOutputStream(client.getOutputStream());
/*异常提示此处没序列化*/ oos.writeObject(allUsers);
oos.flush();
//oos.close();
}catch (Exception e) {
e.printStackTrace();
}
}
客户端
Enumeration<User> allUsers=null;
//服务器返回的信息
ObjectInputStream ois=new ObjectInputStream(clientSocket.getInputStream());
NetTransfer allUsersTransfer=new NetTransfer();
allUsersTransfer=(NetTransfer)ois.readObject();
allUsers=(Enumeration<User>)allUsersTransfer.getObj();
//ois.close();
} catch (Exception e) {
e.printStackTrace();
return allUsers;
}
return allUsers;
}
对序列化不是很懂,求助
如果你想序列化一个对象的话,那这个对象里的成员变量也要支持序列化才行,也就是说NetTransfer中的那个obj也需要实现Serializable接口才行
NetTransfer里面加上下面这个试试:
//序列化ID
private static final long serialVersionUID = -5809782578272943999L;
序列化 实际上 就是把一个java对象(包括成员变量 成员变量的值 成员方法)转化成一个 特殊格式的二进制编码 这里特殊格式
的意思是 这个格式是幂等的 可恢复的 简单说来就是 jvm会根据一定规则(不用了解) 把这个二进制再次转化成java对象,步骤
也很简单 就是你代码里面写的强制转换
NetTransfer 这个类,请写一个readObject方法,如下:
protected Object readResovle() throws ObjectStreamException{
return obj;
}
readResovle 是这个方法,不是readObject方法