如何解决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,依此类推。
这是有道理的,因为协议正确地需要知道它可以期望获得多少个字段。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。