2016-03-30 16 views
2

ScalaPB kullanarak, protobuf iletilerimi serileştirmek için Scala vaka sınıflarımı derledim.ScalaPB ile 'oneof' kullanan bir protobuf mesaj nasıl serileştirilir/kaldırılır?

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; 
} 

nasıl benim WrapperMessage ben msg içinde Login mesaj koymak istiyorum bilerek oluştururum:

aşağıdaki mesajlarla bir .proto dosyası var?

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

Şimdi tel üzerinden WrapperMessage alıyorum; ScalaPB vaka sınıfı yöntemlerini kullanarak iletiyi nasıl deserialize edebilirim?

cevap

3

ScalaPB açıkça soruyorum sorular için örnekler verilmiştir belgelerine sahiptir. Bu cevapta ScalaPB'de verilen örnekleri sorgama göre uyarladım.

oneof içeren bir ileti başlatmak için:

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

bir iletinin oneof alanına karşı eşleştirmek için:

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

Ben ScalaPB en [belgelerine] bakan bulundu 'oneof' özelliği öncesinde değil ScalaPB kullandım. Bu mümkün olduğunda daha deyimsel Scala desenleri Java API önce İngilizce olarak görmek çok güzel. – kliew

0

Boş kurucu ile WrapperMessage başlatmak ve .set_login(login)

Ya "login" ya da "kayıt" döndürür message.WhichOneof üzerine WrapperMessage ve desen maç için serisini ediyorum aramak gerekir. Daha sonra bu özel mesajdaki erişimciyi çağırırsınız (örn. message.login).

+0

Ben WrapperMessage' başarıyla senin tavsiye kullanarak 'başlatmak başardı. Scala'da 'WrapperMessage(). SetLogin (login)' kullandım. Ben sadece hangisi Python API'sında kullanılabileceğine inanıyorum. ScalaPB'yi kullanarak yalnızca Java API'sinde bulunan yöntemleri kullanabilirim. Burada zarif bir çözüm var mı? –

+0

Oh, Java API'sinde hangi alanın belirlendiğini belirten bir numara döndüren "getOneofNameCase" vardır. enum ScalaPB bunu desteklediğini varsayarsak, protobuf scala tanımında tanımlanmalıdır. – kliew

+0

Böyle çalışan bir çözüm vardır eminim ama cevabım sadece (https://trueaccord.github.io/ScalaPB/generated-code.html) ... –

İlgili konular