如何使用dart-protobuf

时间:2014-02-14 03:44:56

标签: dart protocol-buffers

我正在考虑在我的一个项目中使用dart-protobuf而不是JSON。问题是该库没有提供如何使用它的任何示例,并且测试也没有真正帮助。

我对.proto文件的解析如何工作也有点困惑。

所以我正在寻找一个如何在dart中使用这个库的简单示例。

2 个答案:

答案 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库。

这里有一些说明: https://github.com/dart-lang/dart-protoc-plugin