序列化及反序列化接口类

最近在写通信项目的时候遇到了个最主要的问题,用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;

    }

}

你可能感兴趣的:(序列化及反序列化接口类)