基本概念:
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
特别在网络传输中,它的作用显得尤为重要。我们可以把一个类实现序列化,然后在另一端通过反序列化可以得到该对象
例如:我们可以序列化一个对象,不过这个对象要实现序列化方法,并生成序列化号。
这是对一个对象进行序列化和反序列化的过程:
public static byte[] serializeObj(Object object){ if (object == null) { throw new NullPointerException("Can't serialize null"); } byte[] rv = null; ByteArrayOutputStream bos = null; ObjectOutputStream os = null; try { bos = new ByteArrayOutputStream(); os = new ObjectOutputStream(bos); os.writeObject(object); os.writeObject(null); os.close(); bos.close(); rv = bos.toByteArray(); } catch (IOException e) { throw new IllegalArgumentException("Non-serializable object", e); } finally { try { if (os != null) { os.flush(); os.close(); } if (bos != null) { bos.flush(); bos.close(); } } catch (IOException e) { e.printStackTrace(); } } return rv; } @SuppressWarnings("unchecked") public static <T>T deserializeObj(byte[] in,Class<T> clazz) { ByteArrayInputStream bis = null; ObjectInputStream is = null; try { if (in != null) { bis = new ByteArrayInputStream(in); is = new ObjectInputStream(bis); while (true) { T o = (T) is.readObject(); if (o == null) { break; } else { return o; } } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (bis != null) { bis.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; }
下面是一个扩展(对集合的序列化和反序列化):
public static <T>byte[] serializeList(List<T> value ,Class<T> clazz) { if (value == null) { throw new NullPointerException("Can't serialize null"); } byte[] rv = null; ByteArrayOutputStream bos = null; ObjectOutputStream os = null; try { bos = new ByteArrayOutputStream(); os = new ObjectOutputStream(bos); for (T t : value) { os.writeObject(t); } os.writeObject(null); os.close(); bos.close(); rv = bos.toByteArray(); } catch (IOException e) { throw new IllegalArgumentException("Non-serializable object", e); } finally { try { if (os != null) { os.flush(); os.close(); } if (bos != null) { bos.flush(); bos.close(); } } catch (IOException e) { e.printStackTrace(); } } return rv; } @SuppressWarnings("unchecked") public static <T> List<T> deserializeList(byte[] in,Class<T> clazz) { List<T> list = new ArrayList<T>(); ByteArrayInputStream bis = null; ObjectInputStream is = null; try { if (in != null) { bis = new ByteArrayInputStream(in); is = new ObjectInputStream(bis); while (true) { T o = (T) is.readObject(); if (o == null) { break; } else { list.add(o); } } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (bis != null) { bis.close(); } } catch (IOException e) { e.printStackTrace(); } }
时间: 2024-10-08 00:58:45