dubbo源码实践-serialize层的例子

2023-11-06

目录

1 serialize层概述

2 序列化的简单例子

2.1 项目截图

 2.2 三个类的源码

2.2.1 ABC是实体类

2.2.2 TestSeriarsWrite把ABC对象序列化到文件中

2.2.3 TestSeriarsRead从文件中读取ABC对象

2.2.4 运行结果

 3 展示一个通过URL属性动态切换序列化实现类的例子

3.1 原理分析

 3.2 对象到文件的实现类

 3.3 dubbo支持的序列化实现

 4 总结


1 serialize层概述

dubbo官方架构图:框架设计 | Apache Dubbo

  • serialize 数据序列化层:可复用的一些工具,扩展接口为 SerializationObjectInputObjectOutputThreadPool

Serialize层实现两个功能:

        1)把对象序列化成二进制数据,如:保存到文件中。

        2)根据二进制数据生成java的对象,如:从磁盘文件中读取对象。

有两个场景需要把JVM中的对象序列化:

        1)想把一个对象,发送给另外一个应用。

        2)想把一个对象,存储到文件中。

2 序列化的简单例子

2.1 项目截图

ABC是实体类,TestSeriarsWrite把ABC对象序列化到文件中,TestSeriarsRead从文件中读取ABC对象。

 2.2 三个类的源码

2.2.1 ABC是实体类

package org.example.dubbo.serialize;

import java.io.Serializable;

/** 实体类*/
public class ABC implements Serializable {
    private String a;
    private Integer b;
    private int c;
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    public Integer getB() {
        return b;
    }
    public void setB(Integer b) {
        this.b = b;
    }
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }
    @Override
    public String toString() {
        return "ABC{" +
                "a='" + a + '\'' +
                ", b=" + b +
                ", c=" + c +
                '}';
    }
}

2.2.2 TestSeriarsWrite把ABC对象序列化到文件中

文件的位置需要修改成自己机器对应的位置。

Hessian2Serialization这个实现可以自己替换成dubbo支持的其他序列化类,如ProtostuffSerialization。

objectOutput.flushBuffer() 方法不调用,有的序列化类不输出,及生产的文件没有内容。

package org.example.dubbo.serialize;
import org.apache.dubbo.common.serialize.ObjectOutput;
import org.apache.dubbo.common.serialize.Serialization;
import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization;

import java.io.FileOutputStream;
import java.io.IOException;

/** 对象序列化到文件中  */
public class TestSeriarsWrite {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\a\\abc.txt");
        Serialization serialization = new Hessian2Serialization();

        ABC abc = new ABC();
        abc.setA("aaa");
        abc.setB(10);
        abc.setC(20);

        ObjectOutput objectOutput = serialization.serialize(null, fileOutputStream);
        objectOutput.writeObject(abc);
        objectOutput.flushBuffer();
    }
}

2.2.3 TestSeriarsRead从文件中读取ABC对象

package org.example.dubbo.serialize;
import org.apache.dubbo.common.serialize.ObjectInput;
import org.apache.dubbo.common.serialize.Serialization;
import org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization;

import java.io.FileInputStream;
import java.io.IOException;

/** 从文件中加载对象 */
public class TestSeriarsRead {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Serialization serialization = new Hessian2Serialization();
        FileInputStream fileInputStream = new FileInputStream("E:\\a\\abc.txt");
        ObjectInput deserialize = serialization.deserialize(null, fileInputStream);
        ABC abc = deserialize.readObject(ABC.class);
        System.out.println(abc);
    }
}

2.2.4 运行结果

先运行TestSeriarsWrite类,再运行TestSeriarsRead类,会发现可以从文件中获取到该ABC类的对象。

文件内容:

 TestSeriarsRead类运行的结果:

 3 展示一个通过URL属性动态切换序列化实现类的例子

3.1 原理分析

通过dubbo源码,可以看到Serialization是一个自适应扩展点,这样就能实现通过URL属性切换扩展(即实现类)的能力。

由于@Adaptive注解没有指定value值,所以url中的参数名字就是接口的名字,如果是驼峰写法,如XxxYyy,则url参数为xxx.yyy。

 3.2 对象到文件的实现类

package org.example.dubbo.serialize;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.URLBuilder;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.serialize.ObjectOutput;
import org.apache.dubbo.common.serialize.Serialization;

import java.io.FileOutputStream;
import java.io.IOException;

/** 对象序列化到文件中  */
public class TestUrlSeriarsWrite {
    public static void main(String[] args) throws IOException {
        String serializtionName = "hessian2";
        if (args.length > 0) {
            serializtionName = args[0];
        }
        System.out.println("序列化实现类为:" + serializtionName);
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\a\\abc.txt");

        //获取自适应扩展
        Serialization adaptiveExtension = ExtensionLoader.getExtensionLoader(Serialization.class)
                .getAdaptiveExtension();

        ABC abc = new ABC();
        abc.setA("aaa");
        abc.setB(10);
        abc.setC(20);

        //创建Url
        URLBuilder urlBuilder = new URLBuilder();
        urlBuilder.addParameter("serialization", serializtionName);
        URL url = urlBuilder.build();

        //通过URL中的serialization参数,选择对应的实现类
        ObjectOutput objectOutput = adaptiveExtension.serialize(url, fileOutputStream);
        objectOutput.writeObject(abc);
        objectOutput.flushBuffer();
    }
}

通过idea的运行TestUrlSeriarsWrite类,并指定扩展的实现类名称。目前配置的fastjson。

 运行程序后,可以看到对应的文件:E:\a\abc.txt。已经是json格式了。

 3.3 dubbo支持的序列化实现

可以参考dubbo jar包的文件:org.apache.dubbo.common.serialize.Serialization。

等号前面的是扩展的名称,等号右面的是具体的java实现类。

 4 总结

本文描述了dubbo serialize层API的简单使用。 原理请自行网上搜索(网上描述的都比较详细了,就不在copy一份了。)。

下一篇将举例transport层的使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dubbo源码实践-serialize层的例子 的相关文章

随机推荐

  • QT基于百度的人脸考勤系统

    目录 一 百度智能云介绍 二 代码 1 camera类 2 widget类 3 register类 4 dialog类 三 效果演示 四 改进 获取完整代码请前往 GitHub zhaohigh Qt chatrobut 目前还在学习中 需
  • PCB大电流承载方法(100~150A)

    笔者对PCB是否能够承载100 150A大电流的问题进行了分析 一起来看一下吧 常见的PCB可以承载150A电流 但是原则上不推荐作为常规或者持续的使用方法 下面主要论述三个方面 1 PCB承载大电流操作方法 2 PCB承载大电流注意事项
  • Linux查看二进制文件

    Linux查看二进制文件 hexdump hd od xxd hexdump hd 可以使用16进制 10进制 8进制 ascii码的形式查看文件 执行 ls al which hd 就会看到hd其实只是hexdump的一个软链接 使用ma
  • linux定时备份postgresql与恢复数据

    备份命令 参考链接 https www jb51 net article 205924 htm 为了避免操作数据库的风险 因此计划每天对postgresql 数据库 进行定时备份 1 服务器地址 备份服务器地址 10 10 10 101 虚
  • FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

    本文介绍了不同源单表 单表同步 不同源多表 单表同步 注 此版本支持火焰图 Flink版本 1 17 1 环境 Linux CentOS 7 0 jdk1 8 基础文件 flink 1 17 1 bin scala 2 12 tgz fli
  • 艾兰·图灵

    艾伦 麦席森 图灵 1912年生于英国伦敦 1954年死于英国的曼彻斯特 他是计算机逻辑的奠基者 许多人工智能的重要方法也源自于这位伟大的科学家 被誉为计算机科学之父 人工智能之父 计算机逻辑的奠基者 提出了 图灵机 和 图灵测试 等重要概
  • Apifox自动生成接口文档

    1 安装 1 1 Apifox安装 官方文档 Apifox API 文档 调试 Mock 测试一体化协作平台 接口文档工具 接口自动化测试工具 接口Mock工具 API文档工具 API Mock工具 API自动化测试工具 1 2 IDEA
  • 结构体对齐计算方式

    目录 法则一 结构体成员的偏移量必须是成员大小的整数倍 数组除外 法则二 结构体大小必须是所有成员大小的整数倍 数组 结构体除外 带数组的结构体大小计算 带结构体的结构体大小计算 带联合体的结构体大小计算 pragma pack 4 向4对
  • Django模板的使用

    模板文件夹在工程目录下 配置路径 测试 视图 路由 模板 测试 查询数据返回显示在模板中 视图 模板 测试
  • AR开发 - 入门笔记

    文章目录 C C 基础 环境编程 C C 进阶 性能优化 图像处理库 OpenCV 图形学和 OpenGL 深度学习推理库 ncnn GUI框架imgui 多视图几何与 SLAM Unity AR 教程 C C 基础 语法 C99 C 03
  • 前、后端登录验证逻辑

    一 前端先进行第一层校验 前端主要做一些格式的校验 比如用户名 密码的输入符不符合规范 是否为空 验证码输入是否正确 一般验证码的校验在前端 如果验证码都不匹配的话 则不需要调用登录接口 直接return 如果后端给的是图片地址 也可以放在
  • C++中双括号初始化问题

    在刷题时用到了一个栈 网上参考了答案无意中发现了这个双大括号初始化的方法 查阅后发现java有这种用法 说其这本质上是匿名内部类加实例化代码块 但这边个跟类有什么关系 嗯 又想到明明之前用到栈的时候并没有初始化 于是再次定义了一个未初始化的
  • 13. 集群安全

    文章目录 K8S安全机制说明 Authentication 认证 HTTPS 证书需要认证的节点 两种类型 安全性说明 证书颁发 Kubeconfig ServiceAccount Secret 与 SA 的关系 Authorization
  • 【AI面试】降低过拟合的方式方法横评探究

    对于一个 训练调参工程师 来说 在训练过程遇到过拟合现象 是常事 当然 如何降低过拟合 也是在面试过程中 经常被面试官问到的问题 没啥可问的 就只能这样问了 以下是我们会常考虑常事使用的解决方法 按照重要程度依次排列 数据增强 Data A
  • [离散数学]命题逻辑P_3:命题符号化及其应用

    离散数学 命题逻辑P 3 命题符号化及其应用 前言 1 命题联结词的总结 命题联结词 命题联结词的真值表 例子 2 命题联结词的优先级 优先级顺序 例子 3 复合命题符号化 例子 4 联结词应用 开关电路 逻辑电路 网页检索 位运算 总结
  • MYSQL:事务

    事务 理解事务 事务操作 案例 事务的特性 事务的隔离级别 事务的隔离级别 操作 在MySQL中的事务 Transaction 是由存储引擎实现的 在MySQL中 只有InnoDB存储引擎才支持事务 事务处理可以用来维护数据库的完整性 保证
  • 大中型企业网项目实战2021-10-07

    1 问答题 大中型企业网项目实战 实验作业 一 安全管理 1 依据图中拓扑 为全网设备定义主机名 关闭域名解析 并在 Console 和VTY 线路下关闭线路超时并开启输出同步 依据图中拓扑在GNS3 IOU中搭建企业网 外链图片转存失败
  • 小程序封装form表单

    小程序封装form表单 在小程序中 表单是开发中最常用的组件之一 表单可以接收用户的输入数据 并提交给服务器进行处理 为了提高表单的复用性和减少代码重复 我们可以考虑对表单进行封装 使得表单可以在不同的页面中进行复用 本文将分享如何在小程序
  • 查看Linux系统信息

    1 登录到linux服务器执行 lsb release a 命令 即可查看所有版本信息 这个命令适用于所有的linux 包括Redhat SuSE Debian等发行版 注意 centos需要安准lsb LSB是一套核心标准 它保证了LIN
  • dubbo源码实践-serialize层的例子

    目录 1 serialize层概述 2 序列化的简单例子 2 1 项目截图 2 2 三个类的源码 2 2 1 ABC是实体类 2 2 2 TestSeriarsWrite把ABC对象序列化到文件中 2 2 3 TestSeriarsRead