我正在考虑在我的一个项目中使用dart-protobuf而不是JSON。问题是该库没有提供如何使用它的任何示例,并且测试也没有真正帮助。
我对.proto
文件的解析如何工作也有点困惑。
所以我正在寻找一个如何在dart中使用这个库的简单示例。
答案 0 :(得分:6)
我用它而且很棒。 在对我来说最难的部分(de / serialization)下面。也许文档现在更好。
发送请求(query
是要发送的协议缓冲区对象)
request.send(query.writeToBuffer());
接收响应(pb.MovieMessage
是用于反序列化响应的协议缓冲区对象)
request.onLoad.listen((ProgressEvent e) {
if ((request.status >= 200 && request.status < 300) ||
request.status == 0 || request.status == 304) {
List<int> buffer = new Uint8List.view(request.response);
var response = new pb.MovieMessage.fromBuffer(buffer);
修改强>
我向服务器发送PB请求的方法
Future<pb.MovieMessage> send(pb.MovieMessage query) {
var completer = new Completer<pb.MovieMessage>();
var uri = Uri.parse("http://localhost:8080/public/data/");
var request = new HttpRequest()
..open("POST", uri.toString(), async: true)
..overrideMimeType("application/x-google-protobuf")
..setRequestHeader("Accept", "application/x-google-protobuf")
..setRequestHeader("Content-Type", "application/x-google-protobuf")
..responseType = "arraybuffer"
..withCredentials = true // seems to be necessary so that cookies are sent
..onError.listen((e) {
completer.completeError(e);
})
..onProgress.listen((e){},
onError:(e) => _logger.severe("Error: " + e.errorMessage));
request.onReadyStateChange.listen((e){},
onError: (e) => _logger.severe("OnReadyStateChange.OnError: " + e.toString())
);
request.onLoad.listen((ProgressEvent e) {
if ((request.status >= 200 && request.status < 300) ||
request.status == 0 || request.status == 304) {
List<int> buffer = new Uint8List.view(request.response);
var response = new pb.MovieMessage.fromBuffer(buffer);
response.errors.forEach((pb.Error e) => _logger.severe("Error: " + e.errorMessage));
completer.complete(response);
} else {
completer.completeError(e);
}
});
request.send(query.writeToBuffer());
return completer.future;
}
答案 1 :(得分:3)
我对dart-protobuf不太熟悉,但看起来你必须使用protobuf编译器和dart-protoc-plugin项目从原型定义生成你的Dart protobuf库。