RPC框架-对象序列化

序列化概念

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

  • 对象的序列化(encode):

    将对象转化成二进制流

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

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

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

框架名称 性能排序 优点 缺点 是否推荐
Protocal Buffers 1 序列化快;开源 代码侵入性性强,需要相关的配置文件,无法直接使用Java等面向对象编程语言中的对象
Json/fastJson/JackSon 2 序列化快,小巧,传输数据格式使用范围广,开源夸平台,夸语言 对泛型的支持不是很好 极力推荐
Hessian 4 夸平台,夸语言,序列化的使用流程与java内置序列化类似,容易上手 性能略低 推荐
Java内置序列化 5 使用简单 由于是该语言的特殊序列化方式,其他语言没有办法进行解析,夸平台不支持,且性能较低 不支持
Xstream 3 把对象转化成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

你可能感兴趣的:(java框架,java-rpc)