最近在写通信项目的时候遇到了个最主要的问题,用java写客户端的时候,与服务端进行通信的时候不能直接传json或者是对象,只能用byte数组,这时候就需要将对象转换为byte数组
必须注意的一点啊:bytes在反序列化为Object的前提是byte[]是通过ObjectOutputStream序列化的,也就是说序列化和反序列化是有格式的,并不是一个随便的byte数组就能被反序列化的
1.什么是序列化呢呵反序列化呢?
序列化:指把堆内存中的java对象数据,通过某种方式传递给 某个网络节点,(在网络上传输),这个过程就叫做序列化。通俗即为将数据结构或对象转换为二进制串的过程
反序列化:把磁盘文件中的对象数据或者网络节点上的对象数据(即二进制数据),转换为java对象模型的过程
2.java怎么进行序列化呢?
a.需要做序列化的类,必须实现序列化接口,java.lang.Serializable接口这是一个标志接口,没有任何抽象方法),Java 中大多数类都实现了该接口,比如:String,Integer
b.底层会判断,如果当前对象是Serializable的实例,才允许被序列化
c.java中使用对象流来实现序列化和反序列化
ObjectOutputStream:通过 writeObject()方法做序列化操作 ObjectInputStream:通过 readObject() 方法做反序列化操作
3.java中序列化和反序列化的接口类:
public class ObjectAndByte {
/**
* 对象转数组
* @param obj
* @return
*/
public byte[]toByteArray (Object obj) {
byte[] bytes =null;
ByteArrayOutputStream bos =new ByteArrayOutputStream();
try {
ObjectOutputStream oos =new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray ();
oos.close();
bos.close();
}catch (IOException ex) {
ex.printStackTrace();
}
return bytes;
}
/**
* 数组转对象
* @param bytes
* @return
*/
public ObjecttoObject (byte[] bytes) {
Object obj =null;
try {
ByteArrayInputStream bis =new ByteArrayInputStream (bytes);
ObjectInputStream ois =new ObjectInputStream (bis);
obj = ois.readObject();
ois.close();
bis.close();
}catch (IOException ex) {
ex.printStackTrace();
}catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return obj;
}
}