RPC框架-对象序列化

序列化概念

java中,序列化指的是二进制流与对象之间的相互转化.

  • 对象的序列化(encode):

    将对象转化成二进制流

  • 对象的反序列化(decode):

    将二进制流转化成java中的对象.

现主流的序列化框架以及他的优缺点

框架名称性能排序优点缺点是否推荐
Protocal Buffers1序列化快;开源代码侵入性性强,需要相关的配置文件,无法直接使用Java等面向对象编程语言中的对象
Json/fastJson/JackSon2序列化快,小巧,传输数据格式使用范围广,开源夸平台,夸语言对泛型的支持不是很好极力推荐
Hessian4夸平台,夸语言,序列化的使用流程与java内置序列化类似,容易上手性能略低推荐
Java内置序列化5使用简单由于是该语言的特殊序列化方式,其他语言没有办法进行解析,夸平台不支持,且性能较低不支持
Xstream3把对象转化成xml最好用的专业工具使用不是很广泛,因为现在大多数的数据传输都通过json居多xml数据传输序列化则强烈推荐

看代码,看看各个框架在代码中的具体实现

  • Protocal Buffers

    由于使用比较复杂,且能够直接使用Java中的对象,在本文就不做详细的介绍,想要了解的可以参考下如下网址:http://www.jianshu.com/p/b1f18240f0c7

  • FastJson,本文只是简单的做一个例子展示,具体的内容还需要参考官方文档

    • 对象与Json互相转换
      public static void main(){
          Person person = new Person();
          person.setAge(18);
          person.setName("ydw");
          person.setId(1L);
          String ydwStr = JSON.toJSONString(person);
          System.out.println(ydwStr);
      
          Person ydwObj = JSON.parseObject(ydwStr, Person.class);
          System.out.println(ydwObj);
      }
  • Hessian 对象的序列化简单实用

    public static void main(String[] args) throws IOException {
        Person person = new Person();
        person.setAge(18);
        person.setName("ydw");
        person.setId(1L);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        HessianOutput hessianOutput = new HessianOutput(byteArrayOutputStream);
        //序列化
        hessianOutput.writeObject(person);
        byte[] bytes = byteArrayOutputStream.toByteArray();
        //反序列化
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        HessianInput hessianInput = new HessianInput(byteArrayInputStream);
        Person ydw = (Person) hessianInput.readObject();
        System.out.println(ydw);
    }
  • java默认的序列化框架的简单使用
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person();
        person.setAge(18);
        person.setName("ydw");
        person.setId(1L);
        //自定义字节输出流
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        //自定义一个对象输出流
        ObjectOutputStream out = new ObjectOutputStream(os);
        //把对象写入输出流,进行序列化
        out.writeObject(person);
        byte[] bytes = os.toByteArray();

        //自己数组输入流
        ByteArrayInputStream is = new ByteArrayInputStream(bytes);
        //执行反序列化,从字节流中获取对象
        ObjectInputStream inputStream = new ObjectInputStream(is);
        Person ydw = (Person) inputStream.readObject();
        System.out.println(ydw);
    }
  • xstream 对象与XML格式的互相转换
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(18);
        person.setName("ydw");
        person.setId(1L);

        XStream xStream = new XStream(new DomDriver());
        xStream.alias("person",Person.class);
        String xml = xStream.toXML(person);
        System.out.println(xml);

        Person fromXML = (Person) xStream.fromXML(xml);
        System.out.println(fromXML);
    }

以上框架的使用都是比较简单的,框架的使用远不只有这些,例如Json序列化的时候有时候还需要排除一些属性,在本文就不在详细的讲述,大家可以在网络上找到很多的资料进行学习.

数据的传输解决了 ,在RPC框架里面,我们还需要考虑协议的问题,在目前可以分为下面两类

  • 基于TCPRPC框架
  • 基于HTTPRPC框架

后面将会详细的介绍:基于TCP协议的RPC框架 ; 基于HTTP协议的RPC框架

ps:本篇所有的代码地址:https://git.oschina.net/ydwydw/encode_decode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值