当前位置:网站首页>Analysis of Hessian serialization principle
Analysis of Hessian serialization principle
2022-07-07 08:57:00 【bboyzqh】
List of articles
1. hessian Serialization example
1.1 hessian Protocol Brief
1.1.1 characteristic
Refer to the description in the official document , Here are some brief descriptions ,http://hessian.caucho.com/doc/hessian-serialization.html.
- It must self describe the serialization type , That is, no external schema or interface definition is required
- It must be language independent , Including support for scripting languages
- It must be able to read and write in a single way
- It must be as compact as possible
- It must be simple , Only in this way can we effectively test and implement
- Must be as fast as possible
- It has to support Unicode character string
- It has to support 8 Bit binary data , There is no need to escape or use attachments
- It must support encryption 、 Compress 、 Signature and transaction context envelopes
1.1.2 hessian Syntactic introduction
The following examples , More reference :http://hessian.caucho.com/doc/hessian-serialization.html.
#boolean true/false
boolean ::= 'T'
::= 'F'
# list/vector
list ::= 'V' type? length? value* 'z'
::= 'v' int int value* # first int Represents a type reference , the second int Length
#32-bit signed int ( such as 0x90 Encoded as 0)
int ::= 'I' b3 b2 b1 b0
::= [x80-xbf] #-x10 to x3f
::= [xc0-xcf] b0 #-x800 to x7ff
::= [xd0-xd7] b1 b0 #-x40000 to x3ffff
1.2 hessian Examples of serialization and deserialization
public static void serialize1(Student student){
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream("/Users/zhuqiuhui/Desktop/studentHession.txt");
// Get byte stream from object
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output output = new Hessian2Output(os);
output.writeObject(student);
output.getBytesOutputStream().flush();
output.completeMessage();
output.close();
// Write to a file
fileOutputStream.write(os.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
}
public static Student deserialize1(){
FileInputStream fileInputStream;
Object result = null;
try {
fileInputStream = new FileInputStream("/Users/zhuqiuhui/Desktop/studentHession.txt");
byte[] data = new byte[1024];
int len = fileInputStream.read(data);
System.out.println("read byte length:" + len);
// Read the object from the stream
ByteArrayInputStream is = new ByteArrayInputStream(data);
Hessian2Input input = new Hessian2Input(is);
result = input.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return (Student)result;
}
public static void main(String[] args) {
Student student = new Student();
student.setId("123");
student.setName(" Fang Chen ");
// serialize
// serialize1(student);
// Deserialization
Student serializestudent = deserialize1();
System.out.println("deserialize result entity id is "+serializestudent.getId());
System.out.println("deserialize result entity name is "+serializestudent.getName());
}
1.3 hessian Deal with the jdk difference
- Difference one :java Serialization cannot cross language
- Difference two : Versions of old and new objects Java Through one serialVersionUID To relate , Developers need to pay attention to the semantics of serialization
- Difference three :java Serialization does not support encryption
- Difference 4 :Java Serialized content ratio hessian Big
2. hessian Serialization analysis
2.1 hessian Serialization must serialVersionUID Do you ?
hessian Serialized objects do not need to be added serialVersionUID,hessian When serializing, write the description information of the class to byte[] in
2.2 hessian Serialization and deserialization source code analysis
2.2.1 ( back ) The corresponding relationship of serializers
type | Serializer | Deserializer |
---|---|---|
Collection | CollectionSerializer | CollectionDeserializer |
Map | MapSerializer | MapDeserializer |
Iterator | IteratorSerializer | IteratorDeserializer |
Annotation | AnnotationSerializer | AnnotationDeserializer |
Interface | ObjectSerializer | ObjectDeserializer |
Array | ArraySerializer | ArrayDeserializer |
Enumeration | EnumerationSerializer | EnumerationDeserializer |
Enum | EnumSerializer | EnumDeserializer |
Class | ClassSerializer | ClassDeserializer |
Default | JavaSerializer | JavaDeserializer |
Throwable | ThrowableSerializer | |
InputStream | InputStreamSerializer | InputStreamDeserializer |
InetAddress | InetAddressSerializer |
2.2.2 Why serialize objects implements Serializable Interface ?
// com.caucho.hessian.io.SerializerFactory The default serializer will be obtained when serializing
protected Serializer getDefaultSerializer(Class cl) {
if (_defaultSerializer != null)
return _defaultSerializer;
// If the serialized object is not implemented Serializable Interface , It will be thrown out. IllegalStateException
if (! Serializable.class.isAssignableFrom(cl)
&& ! _isAllowNonSerializable) {
throw new IllegalStateException("Serialized class " + cl.getName() + " must implement java.io.Serializable");
}
if (_isEnableUnsafeSerializer
&& JavaSerializer.getWriteReplace(cl) == null) {
return UnsafeSerializer.create(cl);
}
else
return JavaSerializer.create(cl);
}
2.2.3 Serialization process and deserialization process
- Serialization process :Hessian2Output -> SerializerFactory -> Serializer
- Deserialization process :Hessian2Input -> SerializerFactory -> Deserializer
2.3 summary
- Serialize objects to achieve Serializable Interface , Otherwise, it will report “must implement java.io.Serializable” abnormal
- If the serialized object passes hessian After serialization , Serialized object without serialVersionUID when , Re change ( Add object properties 、 Delete object properties ) Will not generate deserialization exceptions , namely hessian Serializing objects no longer requires serialVersionUID.
- hessian It stores all the attributes of a complex object in one Map Serialization in . So in the parent class 、 When a subclass has a member variable with the same name , Hessian Serialization , Serialize subclasses first , Then serialize the parent class , Therefore, the result of deserialization will cause the member variable with the same name of the child class to be overwritten by the value of the parent class .
- hessian Medium writeReplace Methods and readResolve The method works the same , If the serialized object has this method , The instance returned by this method will be used to replace the serialized instance , To ensure the singleness of the object .
边栏推荐
- Led analog and digital dimming
- NCS Chengdu Xindian interview experience
- UnityShader入门精要个人总结--基础篇(一)
- LeetCode 715. Range module
- 求有符号数的原码、反码和补码【C语言】
- 【ChaosBlade:节点 CPU 负载、节点网络延迟、节点网络丢包、节点域名访问异常】
- 【Istio Network CRD VirtualService、Envoyfilter】
- Recommended by Alibaba P8, the test coverage tool - Jacobo is very practical
- STM32串口寄存器库函数配置方法
- Gson converts the entity class to JSON times declare multiple JSON fields named
猜你喜欢
NCS Chengdu Xindian interview experience
Routing information protocol rip
为不同类型设备构建应用的三大更新 | 2022 I/O 重点回顾
Greenplum6.x搭建_环境配置
About using CDN based on Kangle and EP panel
[Yugong series] February 2022 U3D full stack class 007 - production and setting skybox resources
【istio简介、架构、组件】
Greenplum 6.x version change record common manual
Interpolation lookup (two methods)
Simple use of Xray
随机推荐
Common operating commands of Linux
Markdown editor Use of MD plug-in
硬件大熊原创合集(2022/06更新)
Lenovo hybrid cloud Lenovo xcloud: 4 major product lines +it service portal
Skills that testers must know: Selenium's three waiting ways are interpreted clearly
OpenGL frame buffer
[Yugong series] February 2022 U3D full stack class 005 unity engine view
How to count the number of project code lines
串口实验——简单数据收发
模拟卷Leetcode【普通】1705. 吃苹果的最大数目
面试题:高速PCB一般布局、布线原则
Markdown编辑器Editor.md插件的使用
LeetCode 715. Range 模块
What are the advantages of commas in conditional statements- What is the advantage of commas in a conditional statement?
Pointer advanced, string function
阿里p8推荐,测试覆盖率工具—Jacoco,实用性极佳
leetcode134. gas station
Simulation volume leetcode [general] 1609 Parity tree
Explain Huawei's application market in detail, and gradually reduce 32-bit package applications and strategies in 2022
Goldbach conjecture C language