日期:2014-05-19  浏览次数:20695 次

网络传对象

我使用 序列化对象(ByteArrayOut/InputStream;ObjectOut/InputStream)
Java code
public static byte[]objectToByte(Object object)
    {
        byte[] bytes = null;
        try  {
            //object to bytearray
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(object);

            bytes = bo.toByteArray();

            bo.close();
            oo.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return bytes;
    }

Java code

public static Object byteToObject(byte[] bytes) throws Exception
    {
        java.lang.Object obj = null;
        //bytearray to object
        ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
        ObjectInputStream oi = new ObjectInputStream(bi);

        obj = oi.readObject();

        bi.close();
        oi.close();
        return obj;

    }


我的类
Java code

public class Message implements   Serializable{
    
    String sendName;
    String receiveName;
    int command;
    Date sendDate;
    Object content;
    
    public Message()
    {
        
    }
    
    public Message(String inSendName,String inReceiveName,int inCommand,Date inSendDate,Object inContent)
    {
        this.setSendName(inSendName);
        this.setReceiveName(inReceiveName);
        this.setCommand(inCommand);
        this.setSendDate(inSendDate);
        this.setContent(inContent);
    }//后面get,set就不贴了



这样序列出来的对象是带包的路径的,服务端和客户端的类对象的包路径一定要一样才能反序列出来,

我该怎么弄才能不带路径的序列化啊?或者说有其他方法在网络里传递对象。

我的网络传输通道必须是InputStream 和OutputStream;不能使用对象流



------解决方案--------------------
如果是用序列化方式传递对象,则所传递对象的类定义必须在客户端和服务端完全一致。

另一种方式是只传递数据,比如先将其转换为JSON字符串或者XML,那么对方接收后,随便怎么解析都行。

这也是为啥WebService比较火的原因之一,协议跨平台。
------解决方案--------------------
===============================
客户端:
 
Message类所在包:com.myclass

服务端一:

Message类所在包:com.other 通讯结果:不能反序列化对象
================================

包名不一致,只是Message类一致,在JVM中,类加载器识别为不用的class.所以不能反序列化对象