我使用 序列化对象(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.所以不能反序列化对象