Dart Hive TypeAdapter 对 write() 方法的合理性
Posted
技术标签:
【中文标题】Dart Hive TypeAdapter 对 write() 方法的合理性【英文标题】:Dart Hive TypeAdapter rational for write() method 【发布时间】:2021-04-27 08:41:42 【问题描述】:我试图了解在 Hive TypeAdapter 的 write
方法中使用 writeByte(3)
背后的原因。
请考虑课程:
@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);
感谢您的澄清。
【问题讨论】:
【参考方案1】:我对 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();
https://github.com/hivedb/hive/blob/59ad5403593283233d922f62f76832c64fa33a3b/hive_generator/lib/src/class_builder.dart#L122
因此基于此我们可以得出结论,第一个writeByte
是getters
的长度。下一个是第一个 getter (0) 的索引,后面是 value,下一个 getter (1) 是 value,依此类推。
这是有道理的,因为协议需要知道它可以预期获得多少字段。
【讨论】:
以上是关于Dart Hive TypeAdapter 对 write() 方法的合理性的主要内容,如果未能解决你的问题,请参考以下文章
Hive 错误未知类型 TimeStamp 。您是不是忘记注册适配器。如何为外部包中使用的对象类型生成 TypeAdapter?
Hive/Flutter 错误:在 null 上调用了“registerAdapter”