2014-02-14 2 views
3

내 프로젝트 중 하나에서 JSON 대신 dart-protobuf을 사용하려고합니다. 문제는 라이브러리가 라이브러리를 사용하는 방법에 대한 예제를 제공하지 않으며 테스트가 실제로 도움이되지 않는다는 것입니다.dart-protobuf 사용 방법

나는 또한 .proto 파일의 구문 분석이 어떻게 작동하는지 혼란스러워합니다.

그래서이 라이브러리를 다트에서 사용하는 방법에 대한 간단한 예를 찾고 있습니다.

답변

3

저는 dart-protobuf에 익숙하지 않지만 proto 정의에서 Dart protobuf 라이브러리를 생성하려면 protobuf 컴파일러와 dart-protoc-plugin 프로젝트를 사용해야합니다.

어떤 여기에 지침이있다 : 나는 그것을 사용 https://github.com/dart-lang/dart-protoc-plugin

+0

고마워요! 방금 이걸 알아 냈어. 설명 :»일반적으로이 라이브러리를 가져올 필요가 없습니다. protoc 플러그인으로 생성 된 라이브러리 만이 라이브러리를 직접 가져옵니다.«실제로 라이브러리를 직접 생성해야한다는 이유로 조금 혼란 스러웠습니다. – enyo

4

그것은 끝내. 나를 위해 가장 힘든 부분 (de/serialization) 아래. 어쩌면 워드 프로세서가 더 좋을 수도 있습니다.

송신 요청

request.send(query.writeToBuffer()); 

응답을 수신

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 (pb.MovieMessage 응답을 역 직렬화하는 프로토콜 버퍼 목적) (query가 보내 프로토콜 버퍼 목적)

내 방법 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

내가 무엇을 필요로하는지 잘 모르겠습니다. 나는 더 많은 코드를 추가했다. 당신이 이미 달성 한 것과 당신이 갇혀있는 부분을 설명한다면 아마 도움이 될 것입니다. –