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

 

posted @ 2016-12-12 16:29  Zhao Libin  阅读(1144)  评论(0)    收藏  举报