Zookeeper1.序列化

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文从源码角度解析Zookeeper的序列化机制,重点分析`org.zookeeper.jute`包中的核心接口:`InputArchive`、`OutputArchive`、`Index`和`Record`,并通过实例演示其在数据读写中的应用。

1.序列化
一、前言
  在完成了前面的理论学习后,现在可以从源码角度来解析Zookeeper的细节,首先笔者想从序列化入手,因为在网络通信、数据存储中都用到了序列化,下面开始分析。
二、序列化
  序列化主要在zookeeper.jute包中,其中涉及的主要接口如下
    · InputArchive
    · OutputArchive
    · Index
    · Record
2.1 InputArchive
  其是所有反序列化器都需要实现的接口,其方法如下 
InputArchive的类结构如下   

  1. BinaryInputArchive 
  2. CsvInputArchive 
  3. XmlInputArchive
    2.2 OutputArchive
      其是所有序列化器都需要实现此接口,其方法如下。  
    OutputArchive的类结构如下   
  4. BinaryOutputArchive 
  5. CsvOutputArchive 
  6. XmlOutputArchive
    2.3 Index
      其用于迭代反序列化器的迭代器。  
    Index的类结构如下
      
    1.BinaryIndex 
  7. CsxIndex 
    3.XmlIndex
    2.4 Record
      所有用于网络传输或者本地存储的类型都实现该接口,其方法如下 
     所有的实现类都需要实现seriallize和deserialize方法。
    三、示例
      下面通过一个示例来理解OutputArchive和InputArchive的搭配使用。 
    Java
    运行代码
    复制代码
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    package com.leesf.zookeeper_samples;
    public static void main( String[] args ) throws IOException {

     String path = "F:\\test.txt";
     // write operation
     OutputStream outputStream = new FileOutputStream(new File(path));
     BinaryOutputArchive binaryOutputArchive = BinaryOutputArchive.getArchive(outputStream);
    
     binaryOutputArchive.writeBool(true, "boolean");
     byte[] bytes = "leesf".getBytes();
     binaryOutputArchive.writeBuffer(bytes, "buffer");
     binaryOutputArchive.writeDouble(13.14, "double");
     binaryOutputArchive.writeFloat(5.20f, "float");
     binaryOutputArchive.writeInt(520, "int");
     Person person = new Person(25, "leesf");
     binaryOutputArchive.writeRecord(person, "leesf");
     TreeMap<String, Integer> map = new TreeMap<String, Integer>();
     map.put("leesf", 25);
     map.put("dyd", 25);
     Set<String> keys = map.keySet();
     binaryOutputArchive.startMap(map, "map");
     int i = 0;
     for (String key: keys) {
         String tag = i + "";
         binaryOutputArchive.writeString(key, tag);
         binaryOutputArchive.writeInt(map.get(key), tag);
         i++;
     }
    
     binaryOutputArchive.endMap(map, "map");
    
    // read operation
    InputStream inputStream = new FileInputStream(new File(path));
    BinaryInputArchive binaryInputArchive = BinaryInputArchive.getArchive(inputStream);

    System.out.println(binaryInputArchive.readBool("boolean"));
    System.out.println(new String(binaryInputArchive.readBuffer("buffer")));
    System.out.println(binaryInputArchive.readDouble("double"));
    System.out.println(binaryInputArchive.readFloat("float"));
    System.out.println(binaryInputArchive.readInt("int"));
    Person person2 = new Person();
    binaryInputArchive.readRecord(person2, "leesf");
    System.out.println(person2);       

    Index index = binaryInputArchive.startMap("map");
    int j = 0;
    while (!index.done()) {
        String tag = j + "";
        System.out.println("key = " + binaryInputArchive.readString(tag) 
            + ", value = " + binaryInputArchive.readInt(tag));
        index.incr();
        j++;
    }
}

static class Person implements Record {
    private int age;
    private String name;

    public Person() {

    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public void serialize(OutputArchive archive, String tag) throws IOException {
        archive.startRecord(this, tag);
        archive.writeInt(age, "age");
        archive.writeString(name, "name");
        archive.endRecord(this, tag);
    }
    public void deserialize(InputArchive archive, String tag) throws IOException {
        archive.startRecord(tag);
        age = archive.readInt("age");
        name = archive.readString("name");
        archive.endRecord(tag);            
    }    

    public String toString() {
        return "age = " + age + ", name = " + name;
    }
}

}
输出结果
true
leesf
13.14
5.2
520
age = 25, name = leesf
key = dyd, value = 25
key = leesf, value = 25
四、总结
这里只需要知道
序列化涉及的类存放在:org.zookeeper.jute包下
常用的类有:
InputArchive
OutputArchive
Index
Record

相关文章
|
3月前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
2057 89
大厂CIO独家分享:AI如何重塑开发者未来十年
|
4月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
227 6
|
2月前
|
缓存 前端开发 JavaScript
Nginx性能优化
本课程深入讲解Nginx性能优化三大核心:动静分离、客户端缓存与Gzip压缩,涵盖反向代理配置、负载均衡实现及日志分析技巧,结合Shell命令与GoAccess工具进行实战统计,助力掌握企业级Web服务优化方案。
243 36
Nginx性能优化
|
5月前
|
存储 Linux C语言
【零基础友好】Linux 初学者指令指南:常用指令 + 实操案例,一步一步教你用(收藏级)
本教程系统讲解Linux操作系统基础操作与常用指令,涵盖账号管理、路径操作、文件处理、目录管理、文本查看、时间设置、文件搜索、压缩解压等内容,适合初学者快速掌握Linux命令行核心技能。
【零基础友好】Linux 初学者指令指南:常用指令 + 实操案例,一步一步教你用(收藏级)
|
2月前
|
存储 关系型数据库 调度
微服务原理篇(XXLJOB-幂等-MySQL)
本课程深入讲解微服务核心组件XXL-JOB任务调度原理,涵盖其架构、分布式任务处理、幂等性设计及MySQL存储引擎、索引机制、SQL优化与分库分表策略,全面提升系统性能与可靠性。
|
5月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
516 100
|
2月前
|
存储 人工智能 安全
AICoding实践:从Prd到代码生成
本文探讨了在AI技术推动软件工程范式变革的新阶段,如何通过构建增强型AI编程系统(codefuse)实现从需求到代码的端到端自动生成。
1002 21
AICoding实践:从Prd到代码生成
|
2月前
|
Linux Go 虚拟化
docker
Docker是基于Go语言的开源容器技术,实现“一次镜像,处处运行”。它通过容器化隔离应用,对比传统虚拟机更轻量、启动更快。核心组件包括镜像、容器和仓库,利用宿主机内核高效运行,广泛应用于开发、部署与运维全流程。
|
8月前
|
自然语言处理 数据管理 数据库
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发
DMS MCP+通义灵码的梦幻组合,标志着研发流程从“工具堆砌”向“智能闭环”的跃迁。通过统一数据管理、自然语言交互与自动化代码生成,开发者可专注于业务创新,而无需被琐碎的数据库操作所束缚。
告别切屏|阿里云DMS MCP+通义灵码30分钟搞定电商秒杀开发