7月11号 第9天 java对象序列化问题
今天用redis存储,发现客户端jedis提供的存储方法中存储的类型只有String和byte数据,没有能够存储对象的,问了下老大,有两种方法解决,一种是将对象序列化,一种是将对象转化为json格式的字符串。这就开始了我第一次序列化之旅。
要序列化一个对象,首先要创建OutputStream对象,然后将其封装在一个ObjectOutputStream对象内。此时,调用writeObject()方法将对象序列化并发送给OutputStream。在反序列化时,需要将一个InputStream封在ObjectInputStream内,然后调用readObject(),得到的结果是一个Object对象,需要进行转型得到最后所需的对象。需要注意的是,在对一个Serializable对象进行反序列化的过程中,没有调用任何构造器,包括缺省的构造器,整个对象都是通过从InputStream中取得数据恢复过来的。对象序列化是面向字节的,因此采用InputStream和OutputStream层次结构。
下面是一个将Object对象转化为byte数组的例子:
1 public class SerializableUtil { 2 public static byte[] serializableObject(Object value){ 3 ByteArrayOutputStream bOs = new ByteArrayOutputStream(); 4 5 try { 6 ObjectOutputStream oOs = new ObjectOutputStream(bOs); 7 oOs.writeObject(value); 8 } catch (IOException e) { 9 // TODO Auto-generated catch block 10 e.printStackTrace(); 11 } 12 13 return bOs.toByteArray(); 14 } 15 16 @SuppressWarnings("unchecked") 17 public static <T> T reSerializableObject(byte[] byteCode,Class<T> valueType){ 18 ByteArrayInputStream bIs = new ByteArrayInputStream(byteCode); 19 20 try { 21 ObjectInputStream oIs = new ObjectInputStream(bIs); 22 return (T)oIs.readObject(); 23 } catch (IOException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } catch (ClassNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 31 return null; 32 } 33 }