`
san_yun
  • 浏览: 2663528 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

使用Hessian替换java的序列化

 
阅读更多

java 内置的序列化性能很差,我做了个简单的测试,一个UserData类,有一个字符串属性,一个日期属性,一个double属性,分别用java,hessian来序列化一百万 次,结果让人吃惊,不止是hessian序列化的速度要比java的快上一倍,而且hessian序列化后的字节数也要比java的少一倍.因为我在测试 的时候只是做了序列化这部分的工作,并没有把序列化后的结果放到网络上传输,所以,实际中的性能hessian应该会更好!

 

所以当把java对象放到memcached,我们使用hessian的序列化来替代java本身的序列化。

 

 

我用的memcached客户端是用的danga.MemCached包,主要是改动了MemCachedClient的get方法及set方法,在set方法中改为调用hessian的序列化:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//修改以前的序列化代码:
 //(new ObjectOutputStream( bos )).writeObject( value );
//修改后的序列化代码:
serializeByHessian(bos, value);
 val = bos.toByteArray();
serializeByHessian方法如下:  protected void serializeByHessian(OutputStream os, Object object) throws IOException {
        AbstractHessianOutput out = new Hessian2Output(os);;
        SerializerFactory serializerFactory = getSerializerFactory();
        out.setSerializerFactory(serializerFactory);
        out.startReply();
        out.writeObject(object);     
        out.completeReply();
        out.flush();
 }
在get方法中主要是修改了这个方法调用的类ContextObjectInputStream的readObject方法:
在ContextObjectInputStream中覆盖了readObjectOverride方法:
 protected Object readObjectOverride() throws IOException,  ClassNotFoundException {
        ByteArrayInputStream is = new ByteArrayInputStream(bytes);
        ClHessian2Input in = new ClHessian2Input(is, this.mLoader);
        in.setSerializerFactory(getSerializerFactory());
        int code = in.read();//"r"
        int major = in.read();//>=2
        int minor = in.read();//0
        Object value = in.readObject();
        is.close();
        return value;
 }
因为我的框架是基于osgi的,所以我重载了Hessian2Input,把classloader作为参数传进去,否则hessian在反序列化的时候 会找不到类.如果你没有用osgi框架的话, ClHessian2Input in = new ClHessian2Input(is, this.mLoader);这行代码就可以直接用: Hessian2Input in = new Hessian2Input(is);
这样修改就基本完成了.
我把memcached client的序列化协议改为hessian也有另外一个系统架构的原因,那就是因为我的服务层逻辑都是用java+spring+osgi的方式实现, 而web层则是用php实现,两者之间通讯已经是采用hessian的远程调用.所以,部分缓存数据在服务层通过java设置到memcached服务器 中,在php中一样可以用memcached php client读取出来.(php的memcached client我用的是memcached-client.php,而不是php扩展,所以一样可以修改memcached-client.php的序列化 机制)

 

hessian的协议:http://hessian.caucho.com/doc/hessian-serialization.html

参考:http://www.blogjava.net/jjwwhmm/archive/2008/06/18/208784.html

分享到:
评论

相关推荐

    hessian-4.0.38.jar

    java hessian-3.0.38.jar。修改了原生的jar包,解决了hessian 序列化BigDecimal的精度问题。注意,请在hessian服务端和客户端中分别替换此jar包哦!! 只替换服务端hessian jar包还是会有问题。

    spring mvc hessian maven简单实例

    Hessian提供了二进制序列化,使得远程调用的性能比基于HTTP的RESTful API更高效。在实际开发中,可以根据需求调整配置,例如添加安全控制、服务版本管理等。 通过这个简单的实例,你可以学习到Spring MVC与Hessian...

    java开源包8

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包4

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包101

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包6

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包9

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包5

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包10

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包1

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包3

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java源码:brap(Java远程调用框架 BRAP).rar

    6. **序列化与反序列化**:BRAP支持多种序列化协议,如JSON、Hessian、protobuf等,用于在网络间传输对象数据。不同的序列化方式对性能和数据大小有直接影响,开发者可以根据实际场景选择。 7. **通信协议**:BRAP...

    Java资源包01

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    2021最新Java程序员面试题

    - 序列化框架:默认使用Hessian,也支持其他如JSON、Java自带序列化等。 - 服务失效踢出原理:通过心跳检测和超时控制实现。 - 服务版本控制:可以使用版本号控制不同版本服务的兼容。 - Dubbo集群容错方案:如...

    java开源包2

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包11

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    java开源包7

    6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...

    1000道 互联网Java工程师面试题 485页_PDF密码解除.pdf

    1. **序列化框架**:支持多种序列化方式,如 Hessian、Java 自带的序列化等。 2. **服务降级**:在服务调用链过长或服务不可用时,可进行服务降级。 3. **容错机制**:提供容错策略,如 Failover Cluster、Failfast ...

    dubbo介绍和使用

    1. **序列化**:Dubbo 默认使用 Hessian 2 序列化库,同时支持 Java 的 Serializable 机制,并提供了更高效的序列化实现。 - **Hessian 2**:一种高效的二进制格式,适合网络传输。 - **Java Serializable**:Java...

    1000道 互联网大厂Java工程师面试题.pdf

    6. 序列化框架:默认使用Hessian序列化,了解其他如Java自带序列化等。 7. 服务失效踢出原理:服务健康检查失败后,服务提供者会从注册中心中移除服务实例。 8. 服务上线不影响旧版本:Dubbo支持服务降级和分组等...

Global site tag (gtag.js) - Google Analytics