一质和、Hessian序列化的前提
Hessian要實現(xiàn)序列化,前提是被序列化的類得實現(xiàn)Serializable接口稚字。
二饲宿、Hessian序列化的實現(xiàn)
1.首先需要jar
2.代碼實現(xiàn)
public class Student implements Serializable {
private String name;
public static String hobby = "eat";
transient private String address;
}
寫個測試類:
Student stu = new Student();
stu.setAddress("屋子科");
stu.setName("ymz");
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(os);
output.writeObject(stu);
output.close();
Student.hobby = "drink";
ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());
Hessian2Input input = new Hessian2Input(bis);
Student student = (Student) input.readObject();
System.out.println(student.getAddress());
System.out.println(student.getName());
System.out.println(stu.getHobby());
輸出結(jié)果為:
null
ymz
drink
讀出來的靜態(tài)屬性的值是改變后的值,說明靜態(tài)變量不參與序列化尉共;transient修飾的屬性的值為null,說明被transient關(guān)鍵字修飾的屬性依然不參與序列化褒傅。
從結(jié)果可以得出以下結(jié)論:
- 靜態(tài)屬性不能被序列化弃锐;
- transient關(guān)鍵字修飾的屬性不能被序列化袄友;
3.一個值得關(guān)注的坑
Stusdent類集成Teacher類,Teacher類中有跟Stusdent類型相同且屬性名相同的字段name,接下來看代碼:
public class Student extends Teacher implements Serializable {
private String name;
public static String hobby = "eat";
transient private String address;
}
public class Teacher {
private String name;
}
測試類:
Student stu = new Student();
stu.setAddress("屋子科");
stu.setName("ymz");
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(os);
output.writeObject(stu);
output.close();
ByteArrayInputStream bis = new ByteArrayInputStream(os.toByteArray());
Hessian2Input input = new Hessian2Input(bis);
Student student = (Student) input.readObject();
System.out.println(student.getName());
輸出結(jié)果為:
null
理論上輸出的結(jié)果應(yīng)該為“ymz”,但現(xiàn)在為null,原因如下:
- hessian序列化的時候會取出對象的所有自定義屬性霹菊,相同類型的屬性是子類在前父類在后的順序剧蚣;
- hessian在反序列化的時候,是將對象所有屬性取出來旋廷,存放在一個map中 key = 屬性名 value是反序列類鸠按,相同名字的會以子類為準(zhǔn)進行反序列化;
- 相同名字的屬性 在反序列化的是時候饶碘,由于子類在父類前面目尖,子類的屬性總是會被父類的覆蓋,由于java多態(tài)屬性扎运,在上述例子中父類 student.name = null瑟曲。
得出結(jié)論:
使用hessian序列化時饮戳,一定要注意子類和父類不能有同名字段
跟Serializable序列化的比較:
hessian序列化的效率更高,且序列化的數(shù)據(jù)更小洞拨,在基于RPC的調(diào)用方式中性能更好扯罐。