我试图理解在Hive TypeAdapter中的write
方法中使用writeByte(3)
的合理性。
请考虑班级:
@HiveType()
class Person{
@HiveField(0)
String name;
@HiveField(1)
int age;
}
在下面的TypeAdapter
中,很容易理解read
方法,因为它只是按顺序读取每个字段。
然而,我试图弄清楚为什么同样的机制不适用于write
,而不是在每个字段之前使用..writeByte(...)
。
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);
}
}
感谢您的任何澄清。
2条答案
按热度按时间x4shl7ld1#
我对Hive一无所知,但如果你看看创建这个
write
方法的构建器,你可以看到以下内容:https://github.com/hivedb/hive/blob/59ad5403593283233d922f62f76832c64fa33a3b/hive_generator/lib/src/class_builder.dart#L122
因此,基于此,我们可以得出结论,第一个
writeByte
是getters
的长度。下一个是第一个getter(0)的索引,后面是value和下一个getter(1)的值,依此类推。这是有意义的,因为协议需要正确地知道它可以期望得到多少字段。
rfbsl7qr2#
writeByte(2)告诉您要打印多少数据,例如,如果您有三个数据writeByte(3)