Hessian2序列化支持这一点,让重构dubbo接口更容易了(hession2序列化原理)

  本篇文章为你整理了Hessian2序列化支持这一点,让重构dubbo接口更容易了(hession2序列化原理)的详细内容,包含有hessian序列化原理 hession2序列化原理 dubbo 序列化 dubbo为什么用hessian序列化 Hessian2序列化支持这一点,让重构dubbo接口更容易了,希望能帮助你了解 Hessian2序列化支持这一点,让重构dubbo接口更容易了。

   我要说的是MyDto的num属性。当num是Integer时,我们得到hessian2序列化结果,然后,修改num为Long,前面的序列化结果可以正常反序列化。反之,num先是Long并且取值在int范围内,然后修改成Integer,亦能正常反序列化

  
* 通过{@link Base64#getEncoder()}把byte数组序列化成base64串。相应地,利用{@link Base64#getDecoder()}进行字符串的反序列化

   String base64String = Base64.getEncoder().encodeToString(bytes); //new String(serialize, Charsets.UTF_8);

   System.out.println("base64串=" + base64String);

   MyDto myDto2 = (MyDto) Hessian2SerializationUtil.deSerialize(bytes);

   System.out.println(myDto2.getNum());

   @Test

   public void test2() throws IOException {

   String serializedBase64Text = "QxRkdWJib2RlbW8uZHRvLk15RHRvMZMHaW50ZWdlcgRuYW1lAmlkYOFOTg==";

   byte[] bytes = Base64.getDecoder().decode(serializedBase64Text); //s.getBytes(Charsets.UTF_8);

   MyDto myDto2 = (MyDto) Hessian2SerializationUtil.deSerialize(bytes);

   System.out.println(myDto2.getNum());

  }

 

 

  

  Hessian2序列化工具类

  

import com.alibaba.com.caucho.hessian.io.Hessian2Input;

 

  import com.alibaba.com.caucho.hessian.io.Hessian2Output;

  import com.alibaba.com.caucho.hessian.io.SerializerFactory;

  import java.io.ByteArrayInputStream;

  import java.io.ByteArrayOutputStream;

  import java.io.IOException;

  public class Hessian2SerializationUtil {

   * hessian2序列化,返回字节数组

   * @param obj 数据对象

   * @return

   * @throws IOException

   public static byte[] serialize(Object obj) throws IOException {

   ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

   Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream);

   try {

   hessian2Output.setSerializerFactory(new SerializerFactory());

   hessian2Output.writeObject(obj);

   } finally {

   byteArrayOutputStream.close();

   hessian2Output.close();

   return byteArrayOutputStream.toByteArray();

   * hessian2反序列化,得到反序列对象

   * @param bytes 序列化时生成的字节数组

   * @return

   * @throws IOException

   public static Object deSerialize(byte[] bytes) throws IOException {

   ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);

   Hessian2Input hessianInput = new Hessian2Input(byteArrayInputStream);

   try {

   hessianInput.setSerializerFactory(new SerializerFactory());

   return hessianInput.readObject();

   } finally {

   byteArrayInputStream.close();

   hessianInput.close();

  }

 

  View Code

  

  我要说什么呢?
我要说的是MyDto的num属性。当num是Integer时,我们得到hessian2序列化结果,然后,修改num为Long,前面的序列化结果可以正常反序列化。反之,num先是Long并且取值在int范围内,然后修改成Integer,亦能正常反序列化。

  

  这一点对我在做的重构工作有什么帮助呢?

  我们的系统中,服务商的主属性--服务商id,在不同子系统里,这个id字段的类型不统一,varchar/int/bigint,这就致使程序pojo里对应的这个服务商id属性,有的是String,有的是Integer,有的是Long,这给我们的系统迭代(开发 运维)带来了许多麻烦。系统不断升级迭代,服务越来越多,重构的工作量以及风险就加剧,产生系统熵增。

  这几天的北京,市民陆续“阳”起来,我们公司也不例外,2/3的伙伴们都居家养病了。非常时期,一些开发需求就暂缓。我在上周不幸中招,经过难熬的一周,现已基本阳康,趁此机会,take action!决定动手重构一把。

  其中,中台通道系统的channel-provider里有一个dubbo服务LevyMerchantRelationService,它依赖一个数据传输对象LevyMerchantRelationDTO,LevyMerchantRelationDTO里的服务商id类型是Integer。从dubbo控制台来观察,LevyMerchantRelationService的消费者有14个应用共8个java工程。

  那么,我们要变更LevyMerchantRelationDTO里的服务商id类型为Long,这些工程中涉及到这个属性的代码,都要跟着做调整。大好的消息是,有了上面hessian2序列化的这个优势(dubbo RPC默认序列化方式是Hessian2),我们在上线的时候,就不用把14个消费者应用都同时上线,这将极大节省跨小组沟通和上线工作量,更重要的是,dubbo服务正常调用,丝毫不影响系统稳定。

  

  这一点,增强了我这次重构的自信!

  那么,我立马想到,如果dubbo接口方法的参数列表里有Integer的服务商id,是不是也能直接改成Long而不影响dubbo消费者的调用呢?经验证,这个是行不通的!

  

  
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自,转载请注明原文链接:https:///buguge/p/16988123.html

  以上就是Hessian2序列化支持这一点,让重构dubbo接口更容易了(hession2序列化原理)的详细内容,想要了解更多 Hessian2序列化支持这一点,让重构dubbo接口更容易了的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: