dubbo源码实践-serialize层的例子

news2024/9/20 15:07:18

目录

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)从磁盘文件中读取对象。

有两个场景需要把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层的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么云并不总是足够的

虽然人们普遍认为云是未来,但云仍然有多种形式,理解每种形式的各自优点至少可以说是模糊的。 行业分析师有时会争论单租户与多租户部署的优缺点。虽然单租户部署在最近可能是某些组织的可行解决方案,但多租户部署为希望实现运营现代化的组织…

ansible(第一天)

第一章:认识ansible 一、ansible的安装与介绍 1.Ansible软件及公司 ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。 这个工具的目标有这么几项:让我们自动化部署APP;自动化…

Maven总结 - 一、初探-项目构建

maven不仅仅是一款管理jar包的工具,更重要的是一款项目构建的工具 maven下载网站:https://maven.apache.org/ maven搜索网站:http://mvn.coderead.cn/ 一、项目构建 给你一套源代码,你怎么能跑起来? 不能把&#xff0…

日期的格式化与解析

格式化:日期 —> 字符串 解析: 字符串 —> 日期 这里指的是日期的显式格式化和解析 DATE_FORMAT(date,fmt) 按照字符串fmt格式化日期date值 TIME_FORMAT(time,fmt) 按照字符串fmt格式化时间time值 GET_FORMAT(date_type,format_type) 返回…

1、影像组学基础知识

一、What is Radiomics? 提出影像组学论文: **主要目的:**说明肿瘤在时间和空间上的异质性,可以用影像组学说明 时间上的异质性:同一个人同一个肿瘤在不同时间段的表现 空间上的异质性:同一肿瘤在不同个体上的表…

适合编程初学者的开源项目:小游戏2048(Vue版)

目标 为编程初学者打造入门学习项目,使用各种主流编程语言来实现。 2048游戏规则 一共16个单元格,初始时由2或者4构成。 1、手指向一个方向滑动,所有格子会向那个方向运动。 2、相同数字的两个格子,相遇时数字会相加。 3、每次…

分布式存储系统 Ceph 实战操作

文章目录一、概述二、cephadm 工具的使用1)cephadm 工具的介绍2)cephadm 安装3)cephadm 常用命令使用4)启用 ceph shell三、ceph 命令使用1)添加新节点2)使用 ceph 安装软件3)主机操作1、列出主…

Python绘制表白代码,又是一个表白神器(赠源码,文章内有效果展示)

前言 嗨呀,又是我,又给你们带来了表白的代码 之前发了那些 照片里面加文字的…还有烟花…还有跳动爱心…emm你们也可以去看看哦 今天带来的这个,也是很不错哦 只不过它出来的有些慢,我这里先给你们看看这个效果图吧 效果展示…

蓝桥集训(附加面试题)第九天

本文来源于算法面试题特训专栏,这里有大量专业性的算法题比如(动态规划21天,大厂特训28天等等) 欢迎大家一起学习。 链接:传送门 目录标题导读Java蓝桥集训面试题点击直接资料领取导读 在刚刚结束的 每日算法&面…

【大数据】CentOS7 安装 Hive(附有Hive基本使用-练习)

文章目录1.安装并配置Hive处理hive中文乱码2.Hive基本操作3.将本地文件导入Hive练习1练习21.安装并配置Hive 下载 利用Xshell中的xftp,将apache-hive导入到CentOS7的/opt/source文件夹下 解压 解压命令:tar -zxvf apache-hive-1.2.1-bin.tar.gz 重命名…

【人工智能】基于五笔字型规范和人工神经网络的简中汉字识别【一】

导语:看到一则旧闻,读了一篇论文,产生一些思考,完成一个模型 前言及项目简介 一、旧闻二、论文三、思考四、模型一、旧闻 大概去年十一月初吧,博主还在进行紧张的研考冲刺阶段。学校下达毕设选题任务,仓促间就要决定毕设内容,并无思路,不免有些迷茫:既担心选题过于简…

Unc0ver 8.0.0 更新:支持 iOS 14.6-14.8、A12-A13 iPhone 越狱

今日,越狱工具 unc0ver 发布了全新的 8.0.0 版本。现在支持 iOS 14.6-14.8 版本越狱,需要搭载 A12-A13 芯片的 iPhone 手机。 本次越狱支持的系统版本:iOS 14.6、iOS 14.7、iOS 14.7.1、iOS 14.8这4种版本,iOS 15.0以上系统请等待…

【VUE3】保姆级基础讲解(四): vue-router,vuex

目录 后端路由的映射方案 SPA:single page web application url的hash vue-router 基础使用 路由默认url 异步打包 动态路由匹配 notfound 嵌套路由 动态路由 添加路由 添加嵌套路由 删除路由 路由导航守卫 全局前置守卫beforeEach Vuex状态管理 状态…

互联网电商模式的迅速发展,消费返利模式你知道吗?

互联网电商模式的迅速发展,消费返利模式在市面上一直以来的引流能力相信大家都是有目共睹的,只不过因为近两到三年来的返利模式相关负面新闻太多,导致到了大众对于这种模式的一种不信任心理,但不可否认的是目前还是有很多消费者在…

Prompt-NLP新范式

作者:子苏 来源:投稿 编辑:学姐 Prompt综述论文:Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing 论文作者知乎-近代自然语言处理技术发展的“第四范式” NLP技术发展…

【回答问题】ChatGPT上线了!推荐40个以上比较好的目标检测模型

推荐40个以上比较好的目标检测模型? 目标检测是指在图像中找到并标识出特定目标的计算机视觉任务。近年来,机器学习技术的发展使得目标检测取得了长足进步。目前有许多优秀的目标检测模型,下面是推荐的40个以上的比较好的目标检测模型: R-…

事务到底是隔离的还是不隔离的?

我在第 3 篇文章和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无…

尚医通-医院列表接口-等级接口-功能测试(二十二)

目录: (1)医院列表接口-医院等级接口 (2)医院列表接口-远程调用 (3)医院列表接口-功能测试 (1)医院列表接口-医院等级接口 由于我们的医院等级、省市区地址都是取的数据…

BGP在数据中心的应用1——数据中心网络介绍

注: 本文根据《BGP in the Datacenter》整理,有兴趣和英文阅读能力的朋友可以直接看原文:https://www.oreilly.com/library/view/bgp-in-the/9781491983416/ 引子 在传统的大型数据中心,网络通常是三层结构。Cisco称之为&#x…

js函数之call和apply

一、含义 function test() {console.log(----) }//执行 test(); test.call() 结果一致,调用test()默认会调用call,二者效果一致,call省略掉了。 二、改变this指向 call还有一个很重要的功能是改变this的指向。 function Car(brand, color)…