- 浏览: 741913 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luger:
谢谢 解决了我的问题
spring import jar中的bean配置文件 -
diamondy:
sunny80062951414 写道没有fieldinfo信 ...
利用ASM和Javassist动态生成Class 类(set和get) -
sunny80062951414:
没有fieldinfo信息啊。
利用ASM和Javassist动态生成Class 类(set和get) -
somefuture:
求解!求思路!完全迷茫中。
珍藏经典面试题目一个 -
xiao1227372602:
lionbule 写道xiao1227372602 写道请问下 ...
Linux 命令 alternatives和update-alternatives
1、概念介绍
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 数据介质存储
2)
数据网络传输
2、对象序列化实例
为了更好的理解hessian的序列化机制,所以把java和hessian的对象序列化实例都一一列出。
1)对象序列化--java
public byte[] serialize(Object obj) throws Exception { if(obj==null) throw new NullPointerException(); ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(os); out.writeObject(obj); return os.toByteArray(); } public Object deserialize(byte[] by) throws Exception { if(by==null) throw new NullPointerException(); ByteArrayInputStream is = new ByteArrayInputStream(by); ObjectInputStream in = new ObjectInputStream(is); return in.readObject(); }
2)对象序列化--hessian (hessian2的序列化方式在附件中)
public byte[] serialize(Object obj) throws IOException{ if(obj==null) throw new NullPointerException(); ByteArrayOutputStream os = new ByteArrayOutputStream(); HessianOutput ho = new HessianOutput(os); ho.writeObject(obj); return os.toByteArray(); } public Object deserialize(byte[] by) throws IOException{ if(by==null) throw new NullPointerException(); ByteArrayInputStream is = new ByteArrayInputStream(by); HessianInput hi = new HessianInput(is); return hi.readObject(); }
从以上代码不难看出,对象序列化的过程为:
先将对象转为字节码或其它,然后再将其还原为对象。在反序列化时,内存中必须有源对象的所属类。
3、对象序列化效率
hessian2在这方面有了很大的改进,所以优势十分明显。具体细节不再详述,在进阶篇中,我会详述序列化的实现细节。在此仅把实例执行结果公布出来:
java: 77 stxm hessian: 41 stxm hessian2: 30 stxm 说明: 1、数字为对象序列化后的字节长度。 2、‘stxm’为对象方法的执行结果。
hessian2的优点,谁用谁知道。待我再做深入研究之后,再把我自己认为的和大家认为的优点总结一下,并加以解释。
评论
6 楼
lionbule
2011-11-23
请参考如下性能测试结果:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
5 楼
gaopengxiang417
2011-11-20
dongbiying 写道
我测试怎么java的序列化时间比hessian的少呢,
你测试的是对象吗 ?
public static void main(String[] args) throws IOException {
//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));
}
public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}
public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}
public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}
public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
ObjectInputStream in = new ObjectInputStream(is);
return in.readObject();
}
这是我的测试代码 ,请指教呀!
你测试的是对象吗 ?
public static void main(String[] args) throws IOException {
//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));
}
public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}
public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}
public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}
public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
ObjectInputStream in = new ObjectInputStream(is);
return in.readObject();
}
这是我的测试代码 ,请指教呀!
hession不是说序列化的时候时间减少,而是序列化以后在网络上传输的时候能够减少时间(因为流中的字节数减少了一半).
4 楼
dongbiying
2011-11-16
我测试怎么java的序列化时间比hessian的少呢,
你测试的是对象吗 ?
public static void main(String[] args) throws IOException {
//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));
}
public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}
public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}
public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}
public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
ObjectInputStream in = new ObjectInputStream(is);
return in.readObject();
}
这是我的测试代码 ,请指教呀!
你测试的是对象吗 ?
public static void main(String[] args) throws IOException {
//hessian
Long startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = javaSerialize(new User("dby"+i));
}
System.out.println("-----java--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize2(new User("dby"+i));
}
System.out.println("-----hessian2--"+(System.currentTimeMillis()-startLong));
startLong = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
byte[] bytes = serialize(new User("dby"+i));
}
System.out.println("-----hessian--"+(System.currentTimeMillis()-startLong));
}
public static byte[] serialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
HessianOutput ho = new HessianOutput(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
HessianInput hi = new HessianInput(is);
return hi.readObject();
}
public static byte[] serialize2(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
Hessian2Output ho = new Hessian2Output(os);
ho.writeObject(obj);
return os.toByteArray();
}
public static Object deserialize2(byte[] by) throws IOException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
Hessian2Input hi = new Hessian2Input(is);
return hi.readObject();
}
public static byte[] javaSerialize(Object obj) throws IOException{
if(obj==null) throw new NullPointerException();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(obj);
return os.toByteArray();
}
public static Object javaDeserialize(byte[] by) throws IOException, ClassNotFoundException{
if(by==null) throw new NullPointerException();
ByteArrayInputStream is = new ByteArrayInputStream(by);
ObjectInputStream in = new ObjectInputStream(is);
return in.readObject();
}
这是我的测试代码 ,请指教呀!
3 楼
J-catTeam
2010-11-28
haiyupeter 写道
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。
不会的,hessian序列化快的原因是因为它的描述信息比java的少,他用简单的方式描述必要的信息。采取键值对的方式。 所以在序列化一些复杂对象上是有问题的
2 楼
lionbule
2010-08-29
haiyupeter 写道
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。
我坚信“能量守恒定律”。不管哪种方法,只要在实现原理上没有进行彻底的革新,就不会有太大的改观。
换句话说,不是用空间换时间,就是用时间换空间。
所以我们更多关注的应该是实现原理,多看源码就晓得其实每个都差不多。
如果有一天能是“汽车换马车”,就会有很大进步了。期望……
1 楼
haiyupeter
2010-08-16
如果能把序列化后的字节减少,那么问一下会带来多少CPU的损耗。
发表评论
-
spring import jar中的bean配置文件
2012-06-12 17:28 11540在spring中import resource file,有两 ... -
Adding OSGi metadata to existing projects without changing the packaging type
2012-06-05 10:20 1918http://felix.apache.org/site/ap ... -
比较If else 和 try catch 的jvm指令
2012-06-01 10:40 2737编码时过度关注某个点性能,有时候整体性能适得其反!关于if e ... -
java 类加载实例分析之tomcat6.x
2012-03-26 18:47 0[前言] 研究OSGI已经有一段时间,而OSGI的灵魂就在于 ... -
Java 数字转字符串 自动补0
2012-02-20 14:18 3043java中数字转字符,在确定位数的情况下,左边自动补0以对齐 ... -
Java HotSpot VM Options
2012-01-05 11:03 1919http://www.oracle.com/techne ... -
利用ASM和Javassist动态生成Class 类(set和get)
2011-12-30 21:20 11566利用jvm的指令集直接构造class,简单的bean clas ... -
jvm 指令集
2011-12-30 19:46 2250JVM指令助记符 变量到操作数栈:iload,iload_ ... -
switch 和 if elseif 哪个效率高?
2011-12-30 11:23 3348switch 和 if elseif 哪个效率高? ... -
列表和数组的区别
2011-12-27 10:59 4318在数据结构中有多种集合的表现形式!而集合其实就是一个真实 ... -
JVM 选择合适的GC算法
2011-12-19 15:17 1927Selecting a Collector Unles ... -
动态修改JVM 部分参数
2011-12-05 17:00 6994参考地址: http://rednaxelafx.iteye. ... -
Java 快捷读取CLASSPATH下的资源文件
2011-11-30 11:26 17418在JVM中查找classpath下的资源文件,使用Class. ... -
java main函数为非守护线程(实时线程)
2011-11-23 14:29 4429一直认为main为守护线程,google线程相关的资料时,发现 ... -
Solution to Eclipse Warning with SVN
2011-11-14 16:58 1470Solution to Eclipse Warning wit ... -
Java简单数据类型
2011-09-29 11:27 1425简单类型 大小 ... -
spring3.0 单元测试
2011-09-27 18:42 2185spring3.0.0之后的版本,官方极力推荐使用如下方式做单 ... -
logback 之 创建 RollingFileAppender
2011-09-24 17:01 8199最近有需求要将context信息写入文件,以备后续数据分析。本 ... -
logback 之encoder和layout
2011-09-24 16:49 7015encoder 和 layout 在作用上没有本质区别。但是自 ... -
JAVA 排序算法
2011-08-30 21:57 2197import java.util.Random; ...
相关推荐
这涉及到在CXF的配置文件中添加相关配置,指示CXF使用Hessian编码器进行序列化和反序列化。 4. 创建RMI注册表:启动RMI注册表,使得远程对象可以被找到和调用。 5. 客户端调用:在客户端,我们创建一个代理对象,...
- 序列化模块通常是可插拔的,QiuRPC可能内置支持JSON、Hessian、Protobuf等多种序列化方式,开发者可以根据性能和需求选择合适的序列化库。 5. **负载均衡与容错**: - QiuRPC可能会提供简单的负载均衡策略,如...
5. **协议与序列化**:讨论Dubbo支持的通信协议,如`dubbo`、`rmi`、`http`等,以及各种序列化方式,如`Hessian2`、`FastJson`等,分析它们的优缺点和适用场景。 6. **负载均衡策略**:介绍Dubbo内置的多种负载均衡...
当服务消费者调用服务接口时,Dubbo会处理底层的网络通信,如TCP连接,并执行序列化和反序列化操作。Dubbo提供了多种协议供选择,如RPC协议、HTTP协议等,以及多种序列化方式,如Hessian、Java自带的序列化等。此外...
Hessian则通过序列化和反序列化机制实现远程调用,其性能相比纯HTTP协议有显著提升。 总结,"dubbo_rpc_hession_rmi"这个主题涵盖了Dubbo作为RPC框架的核心概念,Hessian作为RPC协议的实现,以及RPC基础理论。通过...
Hessian是一种二进制Web服务协议,它能高效地处理Java对象的序列化和反序列化。在Android开发中,Hessian用于客户端和服务端之间的通信,可以减少数据传输的开销,提高网络通信的效率。通过Hessian,Android应用可以...
在Demo中,通常会默认使用Dubbo协议和Hessian序列化。 6. **服务暴露与引用(Service Export & Reference)**:服务提供者通过`<dubbo:service>`标签暴露服务,而服务消费者通过`<dubbo:reference>`标签引用服务。...
除了基础的使用,深入学习 Dubbox 还包括了解其内部工作原理,如 Remoting 层的通信机制、序列化与反序列化过程、服务治理策略的实现等。此外,结合实际业务场景,学习如何利用 Dubbox 的扩展点实现定制化功能,如...
Hession能自动序列化和反序列化对象,使得远程调用像本地方法调用一样简单。与JSON或XML相比,Hession的二进制格式在传输效率上有着显著的优势。 接下来,我们来看看"springHessianClient"这个压缩包中的文件,这是...
序列化是远程调用中必不可少的一环,Dubbo支持多种序列化方式,如Java自带的序列化、Hessian2、FastJson等。选择合适的序列化方式可以影响到系统的性能和兼容性。 8. **容错机制** Dubbo提供了多种容错策略,如...
- **网络传输优化**:使用更高效的序列化协议(如Hessian2)以及TCP连接复用技术。 - **并发模型**:合理设置线程池大小以平衡资源利用率和响应时间。 - **服务拆分与模块化**:遵循微服务架构原则,合理拆分服务并...
3. 数据传输:请求和响应的数据都通过HTTP协议进行传输,Spring会自动处理对象的序列化和反序列化。 4. 异常处理:HTTP Invoker支持异常的透明传播,客户端可以捕获到服务器端抛出的异常,从而进行相应的处理。 四...
此外,Dubbox 支持多种序列化方式,如 Hessian2、FastJson、Java自带的序列化等。源代码展示了如何根据配置选择合适的序列化算法,并进行数据的编码和解码。 4. **负载均衡策略** 为了提高系统的可用性和响应速度...
除此之外,Dubbo还支持多种通信协议和序列化方式,如RPC协议、HTTP协议,Hessian、Fastjson等序列化库,以适应不同的场景需求。它还具备强大的容错机制,如失败重试、降级策略、隔离策略等,保证了服务的高可用性。 ...
综上所述,阅读和理解Dubbo源码需要较为扎实的Java基础和丰富的框架应用经验,对于希望深入学习分布式系统和服务治理的开发者来说,Dubbo是一个非常好的学习案例。通过本文的详细分析,可以帮助读者快速掌握Dubbo的...
5. **协议与序列化**:讨论Dubbo支持的多种通信协议(如HTTP、TCP、RMI等)和序列化方式(如Hessian、JSON等),以及如何选择合适的组合。 6. **服务注册与发现**:介绍ZooKeeper作为注册中心的角色,以及服务元...
此外,Dubbo还提供了多种序列化方式(如Hessian、JSON等)来满足不同场景下的性能需求。 #### 负载均衡 为了提升服务调用效率和可靠性,Dubbo内置了多种负载均衡策略,如随机算法、轮询算法以及最少活跃调用数算法...
它支持多种传输协议(如TCP、HTTP等)和序列化方式(如Hessian、JSON等),确保了跨语言的互操作性。此外,Dubbo还提供了服务治理的功能,包括服务注册、服务发现、调用路由等,使得微服务架构的构建和维护更加便捷...
Dubbo支持多种通信协议,如RPC(Remote Procedure Call)和HTTP,以及多种序列化方式,如Hessian和Fastjson。 在"edu-service-user"这个入门案例中,我们可以看到一个基础的服务提供者和服务消费者的构建。"edu-...