write()方法的Dart配置单元TypeAdapter合理性

6bc51xsx  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(136)

我试图理解在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);
  }
}

感谢您的任何澄清。

x4shl7ld

x4shl7ld1#

我对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
因此,基于此,我们可以得出结论,第一个writeBytegetters的长度。下一个是第一个getter(0)的索引,后面是value和下一个getter(1)的值,依此类推。
这是有意义的,因为协议需要正确地知道它可以期望得到多少字段。

rfbsl7qr

rfbsl7qr2#

writeByte(2)告诉您要打印多少数据,例如,如果您有三个数据writeByte(3)

相关问题