Liu Zhian 2017-12-21 12:32 采纳率: 60%
浏览 1348
已采纳

java socket对象流输出时序列化的问题?

我现在需要服务端去查询数据库,得到一个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;
    }

对序列化不是很懂,求助

  • 写回答

5条回答 默认 最新

  • RainMi_ 2017-12-22 01:16
    关注

    如果你想序列化一个对象的话,那这个对象里的成员变量也要支持序列化才行,也就是说NetTransfer中的那个obj也需要实现Serializable接口才行

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • JPF1024 2017-12-21 13:19
    关注

    NetTransfer里面加上下面这个试试:

    
    //序列化ID
    private static final long serialVersionUID = -5809782578272943999L;
    
    
    
    评论
  • cloudyzhao 2017-12-22 01:38
    关注

    序列化 实际上 就是把一个java对象(包括成员变量 成员变量的值 成员方法)转化成一个 特殊格式的二进制编码 这里特殊格式
    的意思是 这个格式是幂等的 可恢复的 简单说来就是 jvm会根据一定规则(不用了解) 把这个二进制再次转化成java对象,步骤
    也很简单 就是你代码里面写的强制转换

    评论
  • ꭍꭵꭑ2ha0 企业官方账号 2017-12-22 05:33
    关注

    NetTransfer 这个类,请写一个readObject方法,如下:

    protected Object readResovle() throws ObjectStreamException{
            return obj;
    }
    
    评论
  • ꭍꭵꭑ2ha0 企业官方账号 2017-12-22 05:34
    关注

    readResovle 是这个方法,不是readObject方法

    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 Google Chrome 所有页面崩溃,三种解决方案都没有解决,我崩溃了
  • ¥18 如何用c++编写数学规律题
  • ¥20 使用uni-app发起网络请求,获取重定向302返回的cookie
  • ¥20 手机外部浏览器拉起微信小程序支付 (相关搜索:微信小程序)
  • ¥20 怎样通过一个网址找到其他同样模版的网址
  • ¥30 XIAO esp32c3 读取FDC2214的数据
  • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信
  • ¥15 关于PROCEDURE和FUNCTION的问题
  • ¥100 webapi的部署(标签-服务器)
  • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)