【问题标题】:Dart Hive TypeAdapter rational for write() methodDart Hive TypeAdapter 对 write() 方法的合理性
【发布时间】:2021-04-27 08:41:42
【问题描述】:

我试图了解在 Hive TypeAdapter 的 write 方法中使用 writeByte(3) 背后的原因。

请考虑课程:

@HiveType()
class Person{
  @HiveField(0)
  String name;

  @HiveField(1)
  int age;
}

在下面的TypeAdapterread 方法很容易理解,因为它只是顺序读取每个字段。

但是,我试图弄清楚为什么相同的机制不适用于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);
  }
}

感谢您的澄清。

【问题讨论】:

    标签: dart flutter-hive


    【解决方案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

    因此基于此我们可以得出结论,第一个writeBytegetters 的长度。下一个是第一个 getter (0) 的索引,后面是 value,下一个 getter (1) 是 value,依此类推。

    这是有道理的,因为协议需要知道它可以预期获得多少字段。

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2014-08-10
      • 2013-10-30
      • 1970-01-01
      • 2015-11-22
      • 2011-06-29
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多