2017-04-02 9 views
3

プロトコルバッファーv3とGoを併用しようとしています。プロトコルバッファーv3でoneOfフィールドの構造体を使用する

example.proto

syntax = "proto3"; 

package test; 

import "google/protobuf/timestamp.proto"; 

message Metadata { 
    uint64 userID = 2; 
    google.protobuf.Timestamp time= 3; 
} 

//SignOff when user logs out of Glory 
message SignOff { 
    Metadata metadata =1; 
} 

//SignOn when user logs into Glory 
message SignOn { 
    Metadata metadata =1; 
} 

message EventWrapper { 
    oneof event { 
     SignOff signOff = 1; 
     SignOn signOn = 2; 
    } 
} 

移動

now, _ := ptypes.TimestampProto(time.Now()) 
event := &pb_test.EventWrapper{ 
    Event: &pb_test.EventWrapper_SignOn{ 
     SignOn: &pb_test.SignOn{ 
      Metadata: &pb_test.Metadata{ 
       UserID: 1234, 
       Time: now, 
      }, 
     }, 
    }, 
} 
protoBytes, err := proto.Marshal(event) 
if err != nil { 
    log.Fatal(err) 
} 
log.Println(len(protoBytes) == 0) 

jsonBytes, _ = json.MarshalIndent(event, "", "\t") 
log.Println(string(jsonBytes)) 

protocと変換し、使用して出力がJSONが正しいしかしいるProtobuf符号化されたバイト配列が空であることを示しています。

{ 
    "Event": { 
     "SignOn": { 
      "metadata": { 
       "userID": 1234, 
       "time": { 
        "seconds": 1491143507, 
        "nanos": 654053400 
       } 
      } 
     } 
    } 
} 

意図はgRPC経由ワイヤに沿って送信するために、これらの(repeated *EventWrapper)の配列を持っているが、個々のものは現時点では動作しません。 protobuf Language Guideは、構造体が許可されていないことについて何も言わない。私は行方不明のものがありますか?

答えて

2

プロトコルバッファのドキュメントのなかには、フィールドの構造体を生成するexampleがあります。実際にはexampleが構造体を生成できません。

私は個人的に以前の商用プロジェクトに使用したgogoを使用することをお勧めします。具体的には、

use protoc-gen-gogoslickが必要なパッケージをインストールするためthis sectionを参照してください、そして、あなたのプロジェクトのために、以下を実行します

protoc --gogoslick_out=Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types:. example.proto 
関連する問題