一、环境安装 可以参考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;
}