java 和 hessian2 的序列化以及反序列化
序列化:把java对象转化为字节序列的过程称为序列化;
反序列化:把字节恢复为java对象的过程称为反序列化。
最近看了下java序列化和hessian序列化的过程,大概坐下笔记如下代码分别为java序列化和hessian序列化的方法:
1、java序列化:
1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 4 import java.io.*; 5 6 /** 7 * Created by lbzhao on 2016/12/12. 8 */ 9 public class JavaSerialization { 10 11 private static final Logger logger = LoggerFactory.getLogger(JavaSerialization.class); 12 13 /** 14 * java serialize 15 * @param obj java object 16 * @return java byte array 17 */ 18 public static byte[] serialize(Object obj) { 19 ByteArrayOutputStream os = new ByteArrayOutputStream(); 20 try { 21 ObjectOutputStream out = new ObjectOutputStream(os); 22 out.writeObject(obj); 23 out.close(); 24 } catch (Exception e) { 25 logger.error("java serialize failed," + e); 26 } 27 return os.toByteArray(); 28 } 29 30 /** 31 * java deserialize method 32 * @param bytes java byte array 33 * @return java object 34 */ 35 public static Object deserialize(byte[] bytes) { 36 ByteArrayInputStream is = new ByteArrayInputStream(bytes); 37 Object value = null; 38 try { 39 ObjectInputStream in = new ObjectInputStream(is); 40 value = in.readObject(); 41 in.close(); 42 } catch (Exception e) { 43 logger.error("java deserialize failed," + e); 44 } 45 return value == null ? bytes : value; 46 } 47 }
2、hessian序列化:
1 import com.caucho.hessian.io.*; 2 import org.slf4j.Logger; 3 import org.slf4j.LoggerFactory; 4 5 import java.io.ByteArrayInputStream; 6 import java.io.ByteArrayOutputStream; 7 import java.io.IOException; 8 9 /** 10 * Created by lbzhao on 2016/12/12. 11 */ 12 public class HessianSerialization { 13 14 private final static Logger logger = LoggerFactory.getLogger(HessianSerialization.class); 15 private static SerializerFactory serializerFactory = new SerializerFactory(); 16 17 /** 18 * hessian serialize 19 * @param obj java object 20 * @return byte array 21 */ 22 public static byte[] serialize(Object obj) { 23 ByteArrayOutputStream os = new ByteArrayOutputStream(); 24 AbstractHessianOutput out = new Hessian2Output(os); 25 26 out.setSerializerFactory(serializerFactory); 27 try { 28 out.writeObject(obj); 29 out.close(); 30 } catch (Exception e) { 31 logger.error("hessian serialize failed," + e); 32 } 33 return os.toByteArray(); 34 } 35 36 /** 37 * hessian deserialize 38 * @param bytes byte array 39 * @return java object 40 */ 41 public static Object deserialize(byte[] bytes) { 42 ByteArrayInputStream is = new ByteArrayInputStream(bytes); 43 AbstractHessianInput in = new Hessian2Input(is); 44 45 in.setSerializerFactory(serializerFactory); 46 Object value = null; 47 try { 48 value = in.readObject(); 49 in.close(); 50 } catch (IOException e) { 51 logger.error("hessian deserialize failed," + e); 52 } 53 return value == null ? bytes : value; 54 } 55 }
下面写了一个简单的demo测试了下2者的序列化和反序列化:
import java.io.Serializable; /** * Created by lbzhao on 2016/12/12. */ public class Person implements Serializable { public String name; public int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name:"+name+", age: "+age+"}"; } }
** * Created by lbzhao on 2016/12/12. */ public class SerializeTest { public static void main(String[] args) { Person person = new Person("斌哥", 28); byte[] bytes = JavaSerialization.serialize(person); for (byte by : bytes) { System.out.print(by); } System.out.println(); System.out.println("java serialize person length: " + bytes.length); byte[] bytes1 = HessianSerialization.serialize(person); for (byte by : bytes1) { System.out.print(by); } System.out.println(); System.out.println("hessian serialize length: " + bytes1.length); Object object = JavaSerialization.deserialize(bytes); System.out.println("java deserialize object: " + object); Object object1 = HessianSerialization.deserialize(bytes1); System.out.println("hessian deserialize object: " + object1); System.out.println("person hashCode: " + Integer.toHexString(person.hashCode())); System.out.println("java deserialize hashCode: " + Integer.toHexString(object.hashCode())); System.out.println("hessian deserialize hashCode: " + Integer.toHexString(object1.hashCode())); } }
附上运行结果:
-84-190511511403799111109461029997114461029997114108111971104699111109109111110461171161051081154680101114115111110-11122608863-107-635020273039710310176041109710910111601876106971189747108971101034783116114105110103591201120002811606-26-106-116-27-109-91 java serialize person length: 105 67483799111109461029997114461029997114108111971104699111109109111110461171161051081154680101114115111110-110411097109101397103101962-26-106-116-27-109-91-84 hessian serialize length: 59 java deserialize object: Person{name:斌哥, age: 28} hessian deserialize object: Person{name:斌哥, age: 28} person hashCode: 2d66a22b java deserialize hashCode: 42a9c09e hessian deserialize hashCode: 16a4e743
使用hessian反序列化时,是通过反射调用类的构造函数生成对象,所以对构造函数有一定的要求,一般需要给一个无参构造器,而使用java默认的序列化,正常只需要类实现java.io.Serializable接口。
参考博客:http://hittyt.iteye.com/blog/1691772
http://www.cnblogs.com/happyday56/p/4268249.html

浙公网安备 33010602011771号