2014-02-14 3 views
3

Я рассматриваю использование dart-protobuf вместо JSON в одном из моих проектов. Проблема в том, что библиотека не предоставляет никакого примера, как ее использовать, и тесты также не помогают.Как использовать dart-protobuf

Я также немного смущен тем, как будет работать синтаксический анализ .proto файлов.

Итак, я ищу простой пример использования этой библиотеки в дротике.

ответ

3

Я не слишком хорошо знаком с dart-protobuf, но, похоже, вам нужно использовать компилятор protobuf и проект dart-protoc-plugin для создания вашей библиотеки протоков Dart из прото-определения.

Есть некоторые инструкции здесь: https://github.com/dart-lang/dart-protoc-plugin

+0

Спасибо! Я просто подумал об этом. Описание: «Обычно не нужно импортировать эту библиотеку --- только библиотеки, созданные плагином protoc, импортируют эту библиотеку напрямую». «Было немного запутанно, потому что я действительно не понял, что мне пришлось создавать библиотеки самостоятельно. – enyo

4

Я использую его, и это является удивительным. Ниже была самая сложная для меня часть (де/сериализация). Возможно, теперь документы лучше.

запрос на отправку (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 o отправить запрос 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

Я не уверен, что вам нужно. Я добавил еще несколько кодов. Если вы объясните, что вы уже достигли, и где вы застряли, то, вероятно, легче помочь. –

Смежные вопросы