疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java 序列化与反序列化工具类


 

   

  在基于网络编程的项目中,经常会遇到需要将某些参数进行序列化之后再进行传输,在接收方再进行反序列化操作。普遍的做法是让实体类实现Serializable接口,但是当涉及很多实体类或者说需要序列化的实体类型不确定时(后期会有增加),那使用实现Serializable接口的方式在编程模型上不符合低耦合的原则。所以采用引用工具类的方式去处理。

  public abstract class SerializationUtils {

  /**

  * Serialize the given object to a byte array.

  * @param object the object to serialize

  * @return an array of bytes representing the object in a portable fashion

  */

  public static byte[] serialize(Object object) {

  if (object == null) {

  return null;

  }

  ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);

  try {

  ObjectOutputStream oos = new ObjectOutputStream(baos);

  oos.writeObject(object);

  oos.flush();

  }

  catch (IOException ex) {

  throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);

  }

  return baos.toByteArray();

  }

  /**

  * Deserialize the byte array into an object.

  * @param bytes a serialized object

  * @return the result of deserializing the bytes

  */

  public static Object deserialize(byte[] bytes) {

  if (bytes == null) {

  return null;

  }

  try {

  ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));

  return ois.readObject();

  }

  catch (IOException ex) {

  throw new IllegalArgumentException("Failed to deserialize object", ex);

  }

  catch (ClassNotFoundException ex) {

  throw new IllegalStateException("Failed to deserialize object type", ex);

  }

  }

  }

  * ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,

  * 然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。

  * 在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。

  * 具体用法如下:

  * ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组

  * ByteArrayInputStream: 可以将字节数组转化为输入流

  * 代码实现如下所示:

  * ByteArrayOutputStream把内存中的数据读到字节数组中,

  * 而ByteArrayInputStream又把字节数组中的字节以流的形式读出,

  * 实现了对同一个字节数组的操作.

  public static void main(String[] args) throws IOException {

  ByteArrayOutputStream bout = new ByteArrayOutputStream();

  DataOutputStream dout = new DataOutputStream(bout);

  String name = "XYY";

  int age = 27;

  dout.writeUTF(name);

  dout.writeInt(age);

  byte[] buff = bout.toByteArray();

  ByteArrayInputStream bin = new ByteArrayInputStream(buff);

  DataInputStream dis = new DataInputStream(bin);

  String newName = dis.readUTF();

  int newAge = dis.readInt();

  System.out.println(newName + ":" + newAge);

  }

  * java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象 。在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。