交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
第4-2 章:序列化与反序列化
分享
未结
0
893
李延
LV6
2021-09-08
悬赏:20积分
# 作用 通过前面数据分析我们知道所有数据是保存在内存中以DataNode对象存储。而在系统运行中涉及一下内容的数据转换: - 网络接收到的数据需要反序列化为java对象。 - java内存的数据需要定时序列化为快照数据存储。 - 快照数据需要序列化为java对象。 对于上面这些序列化与反序列化 情况zookeeper封装了一系列的接口与实现类,这里统一进行说明 # 整体说明 相关接口的内容在如下包中  其中主要涉及接口 Record、OutputArchive、InputArchive Record中我们看到 ```java @InterfaceAudience.Public public interface Record { // 真正的序列化方法(把java对象,写到网络流中,持久化到磁盘中) public void serialize(OutputArchive archive, String tag) throws IOException; // 真正的反序列化方法(从网络流中读取对象。) public void deserialize(InputArchive archive, String tag) throws IOException; } ```` 其中就两个接口一个序列化、一个反序列化。并且同时需要OutputArchive、InputArchive对象。而这两个对象。类似我们java中的io流输入输出流对象。 # OutputArchive 输出流。用于将我们java对象输出到指定目标 其中构造函数中需要一个OutputStream。  也就是说OutputArchive对象其实就是我们的OutputStream一种封装,其中对于基本数据类型就是调用的OutputStream方法 其中我们关注的是string对象 ```java public void writeString(String s, String tag) throws IOException { if (s == null) { writeInt(-1, "len"); return; } ByteBuffer bb = stringToByteBuffer(s); writeInt(bb.remaining(), "len"); out.write(bb.array(), bb.position(), bb.limit()); } ``` 我们看到首先是记录了字符串的长度,而后是保存的字符串 # InputArchive archive 与OutputArchive相似,也是封装的输入流,不再详细说明 # Record 对于不同数据的类型,都有自己的实现。子类特别多。  我们这里主要看DataNode的序列化 ```JAVA public synchronized void deserialize(InputArchive archive, String tag) throws IOException { archive.startRecord("node"); data = archive.readBuffer("data"); acl = archive.readLong("acl"); stat = new StatPersisted(); stat.deserialize(archive, "statpersisted"); archive.endRecord("node"); } public synchronized void serialize(OutputArchive archive, String tag) throws IOException { archive.startRecord(this, "node"); archive.writeBuffer(data, "data"); archive.writeLong(acl, "acl"); stat.serialize(archive, "statpersisted"); archive.endRecord(this, "node"); } ``` 我们看到其实比较简单。首先序列化 data内容,然后序列化acl内容。stat内容,交给具体的stat对象去实例化 # Index 类似于iterator的迭代功能,单没有数据,只提供迭代,用于判断是否还有接下来的数据。 我们看一看他的唯一实现类 ```java private static class BinaryIndex implements Index { private int nelems; BinaryIndex(int nelems) { this.nelems = nelems; } public boolean done() { return (nelems <= 0); } public void incr() { nelems--; } } ```
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号