2014-02-14 39 views
3

我正在考慮在我的一個項目中使用dart-protobuf而不是JSON。問題是圖書館沒有提供任何如何使用它的例子,測試也沒有真正幫助。如何使用dart-protobuf

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

所以我正在尋找一個簡單的例子來說明如何在飛鏢中使用這個庫。

回答

3

我對dart-protobuf不太熟悉,但看起來您必須使用protobuf編譯器和dart-protoc-plugin項目來從原型定義生成Dart protobuf庫。

這裏有一些說明: https://github.com/dart-lang/dart-protoc-plugin

+0

謝謝!我剛剛發現了這一秒。描述:»通常不需要導入這個庫---只有protoc插件生成的庫直接導入這個庫。«有點混亂,因爲我沒有真正意識到我必須自己生成庫。 – enyo

4

我用它和它的真棒。 對我來說最難的部分(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); 

EDIT

我的方法t Ø發送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; 
    } 
+0

你是如何創建初始請求的? – lucperkins

+0

我不確定你需要什麼。我添加了更多的代碼。如果你解釋了你已經取得的成就以及你陷入困境的原因,那麼可能會更容易提供幫助。 –