2016-03-30 8 views
2

私はScalaPBを使用して、私のprotobufメッセージをシリアライズするためにScalaのケースクラスをコンパイルしています。ScalaPBで 'oneof'を使用するprotobufメッセージをシリアル化/デシリアライズする方法はありますか?

私は次のメッセージと.protoファイルがあります:

message WrapperMessage { 
    oneof msg { 
     Login login = 1; 
     Register register = 2; 
    } 
} 

message Login { 
    required string email = 1; 
    required string password = 2; 
} 

message Register { 
    required string email = 1; 
    required string password = 2; 
    optional string firstName = 3; 
    optional string lastName = 4; 
} 

がどのように私はmsgLoginメッセージを入れたいことを知っている私のWrapperMessageを作成するのですか?

val login = Login(email = "[email protected]", password = "testpass") 
    val wrapperMessage = WrapperMessage(???) 
    val wrapperMessageBytes = wrapperMessage.toByteArray 

のは、私がワイヤ上WrapperMessageを受け付けておりますことを今言ってみましょう。 ScalaPBのケースクラスメソッドを使用してメッセージをどのように非直列化するのですか?

答えて

3

ScalaPBには、私が求めている質問の例が明確に書かれています。この回答では、ScalaPBで提供されているサンプルを私の質問に合わせて調整しました。メッセージのoneofフィールド照合するには

val login = Login(email = "[email protected]", password = "testpass") 
val wrapperMessage = WrapperMessage().withLogin(login) 

oneofとのメッセージを初期化するために

wrapperMessage.msg match { 
    case Msg.Login(l) => // handle l 
    case Msg.Register(r) => // handle r 
    case Msg.Empty => // handle exceptional case... 
} 
+0

私は、 'oneof'機能の前にScalaPBを使用しましたが、使用しませんでした。可能であれば、Java APIをより慣用的なScalaパターンに変換したことが分かりました。 – kliew

0

あなたは空のコンストラクタとWrapperMessageを初期化しますが、「ログイン」または「登録」のいずれかを返したmessage.WhichOneofWrapperMessageとパターンマッチにデシリアライズう.set_login(login)

を呼び出すことができるはずです。次に、その特定のメッセージ(つまり、message.login)でアクセサを呼び出します。

+0

私は正常にあなたのアドバイスを使用して 'WrapperMessage'を初期化することができました。 Scalaでは 'WrapperMessage()。setLogin(login)'を使用しました。私は 'whichOneof'がPython APIでのみ利用可能であると信じています。 ScalaPBを使用してJava APIにあるメソッドのみを使用できます。そこにエレガントなソリューションはありますか? –

+0

ああ、Java APIには、どのフィールドが設定されているかを示すenumを返す 'getOneofNameCase'があります。列挙型は、ScalaPBがサポートしていると仮定して、プロトタイプのスカラ定義で定義する必要があります。 – kliew

+0

私はこのように動作する解決策があると確信していますが、ScalaPBの[documentation](https://trueaccord.github.io/ScalaPB/generated-code.html)を見て私の答えを見つけました... –

関連する問題