dart - Dart Hive TypeAdapter 对 write() 方法的合理性
问题描述
我试图了解在 Hive TypeAdapter 方法中使用writeByte(3)
的原因。write
请考虑类:
@HiveType()
class Person{
@HiveField(0)
String name;
@HiveField(1)
int age;
}
在TypeAdapter
下面很容易理解该read
方法,因为它只是顺序读取每个字段。
但是,我试图弄清楚为什么相同的机制不适用于write
, 而不是..writeByte(...)
在每个字段之前使用。而且,第一个是什么意思..writeByte(2)
?
class PersonAdapter extends TypeAdapter<Person> {
@override
Person read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Trips()
..name = fields[0] as String
..age = fields[1] as int;
}
@override
void write(BinaryWriter writer, Person obj) {
writer
..writeByte(2) // Why this here? (sometimes I see writeByte(3) !! )
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.age);
}
}
感谢您的任何澄清。
解决方案
我对 Hive 一无所知,但如果您查看创建此write
方法的构建器,您会看到以下内容:
String buildWrite() {
var code = StringBuffer();
code.writeln('writer');
code.writeln('..writeByte(${getters.length})');
for (var field in getters) {
var value = _convertIterable(field.type, 'obj.${field.name}');
code.writeln('''
..writeByte(${field.index})
..write($value)''');
}
code.writeln(';');
return code.toString();
}
因此,基于此我们可以得出结论,第一个writeByte
是 的长度getters
。下一个是第一个 getter (0) 的索引,然后是 value,下一个 getter (1) 是 value,依此类推。
这是有道理的,因为协议正确地需要知道它可以期望获得多少个字段。
推荐阅读
- sql-server - SQL 排除包含所需项目以外的任何内容的行
- docker - 如何使用 docker-compose 快速恢复新数据库以进行集成测试?
- javascript - 在打字稿中添加十进制值
- php - how to bring back filtered rows in an html table using PHP (no MySQL)
- javascript - 在 React 中手动触发表单的提交事件不会检查所需的输入
- python - 生成器的 Python 开始
- python - 在 KV 语言中使用类
- java - Java - 如何在不知道类名的情况下使用接口调用方法类
- c# - 使用 HttpClient 发布数据
- css - materializecss 复选框未显示在 aspx 站点中