我有一个序列化对象Message,要对它发送到远程主机上,如下代码
private void handler(){
try {
Message message = new Message();
message.setMessageId(this.userID+this.getId());

ObjectOutputStream outObject = new ObjectOutputStream(new FileOutputStream(this.userID+this.getId()));
outObject.writeObject(message);
outObject.flush();
outObject.close();


ObjectInputStream inObject = new ObjectInputStream(new FileInputStream(this.userID+this.getId()));
byte[]b = new byte[1024*1024*10];
int r = 0;
while((r = inObject.read(b, 0, 1024*1024*10))>-1){
byte[]bs = new byte[r];
System.arraycopy(b, 0, bs, 0, r); //发送对象(远程主机ID,序列化对象);
send("99999999",bs);
}
inObject.close();

} catch (IOException e) {
e.printStackTrace();
} }我要问的问题是:
上面代码中Message对象已经在内存中,为什么要把它写到文件中去,然后读进内存来,再发送对象,能不能直接把内存中的Message发送到远程主机,而不用“把它写到文件中去”和“读进内存来”这两步去掉,一句话,我想直接把Message发送到远程主机,有什么方法可以实现呢??请各位朋友赐教!!谢谢!!

解决方案 »

  1.   

    当然可以,用ByteArrayOutputStream和ByteArrayInputStream搞定。
    具体就是先写到一个ByteArrayOutputStream而不是File...
    然后从ByteArrayOutputStream里取出内容(toByteArray()),创建一个ByteArrayInputStream,替换上面代码里的FileInputStream
      

  2.   


    如果用ByteArrayOutputStream的话,那Message对象怎么写到ByteArrayOutputStream中去了???
      

  3.   

    可以不用写到文件中,让他直接以对象的形式发送。
    这个时候你的Message这个类需要实现一个可序列话接口Serializable就可以了直接传输对象了
    你可以去试试,还不明白,留言
      

  4.   


    我有一个序列化对象Message.........
    这么兄弟,看来是我问题没描述清楚,让你没看明白,真对不起啊!!!!
      

  5.   

    ObjectOutputStream(OutputStream out)   构造的时候参数设置为远程机器的socket获得的流不就行了
      

  6.   

    socket发送数据不也没写文件么
      

  7.   

    不是用的Socket,用的是第三个通信连接,只能通过send(String userID,byte[]b)方法发送内容,目前可以考虑一下重写ObjectOutputStream的writeObject(Object obj) 方法,有人了解这个方法的吗??说点来听听,谢谢!!!!
      

  8.   

    我建议你不要用JDK的序列化,你可以自己写一个序列化的方法,可以序列化简单类型/List/Map这些类型,这样数据又可以直接存储到数据库,可以手动更改,不用担心版本问题
      

  9.   

    不是必须的,不过不了解你用的第3方API怎么发送的。直接用一个 socket output stream 当成 ObjectOutputStream 的 delegate 就可以发送了。如果你需要使用二进制的方法发送对象,那 JDK 的方法没有问题,它可以有不少的自定义的过程,一般可以满足需要,如果你觉得需要更高级的支持自己的协议的方式传送消息,那就干脆用基本 XML 的消息,这样就可以使用任何通信手段,也可以使用更地的网络通信API,比如加密的压缩的。
      

  10.   

    看 java.Sun.com  站点上的 tutorial,比较系统地讲解 serialization 过程。另外还有一篇:Google 这个关键字:你不知道的5件事 site:ibm.com
      

  11.   

    Message实现了序列化接口后,有时候还要给它一个serialVersionUID。
    然后你就直接用
    ObjectOutputStrem out = new ObjectOutputStream(socket.getOutputStrem());
    out.writeObject(message);//直接传输对象过去就可以了
    在接的一方使用
    ObjectInputStream in = new ObjectInputStrem(socket.getInputStrem());
    Message message = (Message)in.readObject();
    这个样子就OK了.你可以试试,我已经测试过很多次了。