flutter 应用protobuf

522 阅读1分钟

一、环境安装 可以参考www.jianshu.com/p/7f9e8db50…

brew install protobuf

安装dart
brew tap dart-lang/dart
brew install dart

二、创建proto 文件

具体文件格式规范参考zhuanlan.zhihu.com/p/566618733…

例子 文件名为myProto.proto

message mmData {
    optional int32 num = 1;
    optional int32 def_num = 2 [default=10];
    required string str = 3;
    repeated string rep_str = 4;
}

切换到终端 通过指令生成dart文件 myProto.pb.dart

protoc --dart_out=. myProto.proto

////  Generated code. Do not modify.//  source: myProto.proto//// @dart = 2.12
// ignore_for_file: annotate_overrides, camel_case_types, comment_references// ignore_for_file: constant_identifier_names, library_prefixes// ignore_for_file: non_constant_identifier_names, prefer_final_fields// ignore_for_file: unnecessary_import, unnecessary_this, unused_import
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class mmData extends $pb.GeneratedMessage {  factory mmData({    $core.int? num,    $core.int? defNum,    $core.String? str,    $core.Iterable<$core.String>? repStr,  }) {    final $result = create();    if (num != null) {      $result.num = num;    }    if (defNum != null) {      $result.defNum = defNum;    }    if (str != null) {      $result.str = str;    }    if (repStr != null) {      $result.repStr.addAll(repStr);    }    return $result;  }  mmData._() : super();  factory mmData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);  factory mmData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'mmData', createEmptyInstance: create)    ..a<$core.int>(1, _omitFieldNames ? '' : 'num', $pb.PbFieldType.O3)    ..a<$core.int>(2, _omitFieldNames ? '' : 'defNum', $pb.PbFieldType.O3, defaultOrMaker: 10)    ..aQS(3, _omitFieldNames ? '' : 'str')    ..pPS(4, _omitFieldNames ? '' : 'repStr')  ;
  @$core.Deprecated(  'Using this can add significant overhead to your binary. '  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '  'Will be removed in next major version')  mmData clone() => mmData()..mergeFromMessage(this);  @$core.Deprecated(  'Using this can add significant overhead to your binary. '  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '  'Will be removed in next major version')  mmData copyWith(void Function(mmData) updates) => super.copyWith((message) => updates(message as mmData)) as mmData;
  $pb.BuilderInfo get info_ => _i;
  @$core.pragma('dart2js:noInline')  static mmData create() => mmData._();  mmData createEmptyInstance() => create();  static $pb.PbList<mmData> createRepeated() => $pb.PbList<mmData>();  @$core.pragma('dart2js:noInline')  static mmData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<mmData>(create);  static mmData? _defaultInstance;
  @$pb.TagNumber(1)  $core.int get num => $_getIZ(0);  @$pb.TagNumber(1)  set num($core.int v) { $_setSignedInt32(0, v); }  @$pb.TagNumber(1)  $core.bool hasNum() => $_has(0);  @$pb.TagNumber(1)  void clearNum() => clearField(1);
  @$pb.TagNumber(2)  $core.int get defNum => $_getI(1, 10);  @$pb.TagNumber(2)  set defNum($core.int v) { $_setSignedInt32(1, v); }  @$pb.TagNumber(2)  $core.bool hasDefNum() => $_has(1);  @$pb.TagNumber(2)  void clearDefNum() => clearField(2);
  @$pb.TagNumber(3)  $core.String get str => $_getSZ(2);  @$pb.TagNumber(3)  set str($core.String v) { $_setString(2, v); }  @$pb.TagNumber(3)  $core.bool hasStr() => $_has(2);  @$pb.TagNumber(3)  void clearStr() => clearField(3);
  @$pb.TagNumber(4)  $core.List<$core.String> get repStr => $_getList(3);}

const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');

四、类型转换数据传输

1、myProto.pb.dart 模型对象转Data

mmData obj = mmData();Uint8List buf = ob.writeToBuffer();

2、map 转 protobuf Data

   Map map = {     
 'num': 1001212132,     
 'str': '这是字符串',      
'defNum': 1212312, 
   }; 
 mmData ob = mmData.create()..mergeFromProto3Json(map);
下一步就是 回到第1

3、myProto.pb.dart 模型对象转json

mmData obj = mmData();ob.toProto3Json();

补充

map转data 比较protobuf 后大小至少小了一半Map map = {     
 'num': 1001212132,      'str': '这是字符串',     
 'defNum': 1212312,    };
String jsonStr = jsonEncode(map);
List<int> bufData = utf8.encode(jsonStr);

嵌套模型
 message Dog {
    required string name = 1;
    optional int32 age = 2;
} 

message Person {
    optional int32 age = 1;
    required string name = 3;
    optional string looklike = 4;
    optional Dog dog = 5;
}