Protobuf 3 neden mesajlardaki tüm alanları isteğe bağlı kıldı?


15

Protobuf sözdizimi 3 kelime bırakarak isteğe tüm alanları yapılmış requiredve optionalönceki proto2 sözdiziminden. Geliştiricilerden bazı yorumları okumak , ileri / geri ikili uyumluluğu arttırmak için yapıldığı anlaşılıyor.

Ama benim için, bu sadece paket adlarının sürümlendirilmesi ile zorlanabilirdi, com.example.messages.v1ve sonra müşterilerin anladıkları serileştiricileri uygulamalarına izin verin. Aynı zamanda, bir yazılım mühendisliği açısından yararlı olan, tür olarak belirtilen bazı sözleşmeleri kaldırır. Mesela eğer

message Location {
   double latitude = 1;
   double longitude = 2;
}

Proto3'te Location, zorunlu alanlardan birini sağlayarak yarı yedekli ancak mükemmel bir şekilde oluşturmak mümkündür .

İstemciler arasında veri alışverişi için şema tabanlı bir serileştirme biçimi oluştururken bu büyük bir dezavantaj değil mi? Gerekli tüm alanların geçerli değerlere sahip olup olmadığını kontrol ederek her istemciye ekstra doğrulama kodu taşımak daha kötü değil mi?


Yanıtlar:


13

proto3 (anladığım kadarıyla), platformlar arası senaryolarda çok daha kullanışlı hale getirmeyi amaçlayan bir dizi değişiklik yapar . "Atandı" ve "atanmamış ancak varsayılan değeri bildirme" özelliklerinin açıkça izlenmesi, bazı hedef platformlarda uygulanması çok zor olabilir ve kullanımı da kafa karıştırıcı olabilir. Bu nedenle, proto3 çok daha basit bir yaklaşım benimser:

  • örtülü varsayılan değer doğal sıfır değeri (sayılar / enums), yanlış (boolean) veya boş dize (dize)
  • yalnızca örtük varsayılana izin verilir; başka varsayılan değere izin verilmiyor
  • bir alan bu varsayılan değere sahipse serileştirilmez; asla sıfır / yanlış / boş dizeye vs atanmamış olması önemli değil
  • Bu nedenle, "açıkça" sıfır değeri atandığı ve "asla bir değer atanmamış" olduğu için "zorunlu" kavramı yoktur.

Proto3'te, zorunlu alanlardan birini sağlayarak yarı yedekli ancak mükemmel şekilde geçerli bir Konum oluşturmak mümkündür.

Diğer değer: sıfır. Açıkça sıfıra atamadığınız gerçeği tartışmalıdır. Bunun istenip istenmediği size bağlıdır, ancak benim için mantıklıdır ve çok sayıda "yeni nesne / yapıyı başlat" ın çok çeşitli platformlarda nasıl çalıştığıdır.

Gerekli tüm alanların geçerli değerlere sahip olup olmadığını kontrol ederek her istemciye ekstra doğrulama kodu taşımak daha kötü değil mi?

Doğrulayacak bir şey yok! Düzen, sıfır değeri açıkça atanmış olsaydı tam olarak ne olacağıdır. Bu yasal ise yasaldır. Yasadışı ise (sıfır sizin için bir anlam ifade etmediğinden), yasadışıdır; ancak açık veya örtük olması yasadışı olurdu. İlgili doğrulama miktarı değişmez.

İstemciler arasında veri alışverişi için şema tabanlı bir serileştirme biçimi oluştururken bu büyük bir dezavantaj değil mi?

Genellikle değil, hayır ... özellikle şema sürümü açık olduğundan. Proto2'yi kullanmak istiyorsanız: proto2'yi kullanın. Hiçbir şey otomatik olarak değişmez.


Protobuf'un bir tür şema olmadan gerçekten kullanılamadığından, "varsayılan olarak sadece doğal sıfır" ın ne satın aldığını merak ediyorum. Tutarlı varsayılanları sağlamak, ilk etapta tutarlı şemalar sağlamaktan daha zor gelmez.
CodesInChaos

1
@CodesInChaos bu ilginç, çünkü protobuf-net'te şemadan daha az protobuf yapıyorum ... iyi, sonsuza dek :) , çoğu kullanıcının koddan önce ve şemadan arınmış olması bekleniyor . Ve ilginç bir şekilde (en azından benim için), protobuf-net kullanımının "basit, aptalca tut" varsayılan stratejilerinin çoğu , proto3'ün kullanmayı seçtiği yöntemle tamamen aynıdır. Bunun rastgele partizan kararlarımı doğruladığını iddia etmeyeceğim, ama ... tamamen öyle :)
Marc Gravell

C # sınıfı bir şema türü olarak kabul ediyorum ve kesinlikle öznitelikler aracılığıyla varsayılan değerleri belirtebilirsiniz. Bunu, örneğin herhangi bir şema olmadan anlamlı bir veri yapısı oluşturabilen msgpack veya json ile karşılaştırın.
CodesInChaos

@CodesInChaos kabul etti ve kaydetti - ve evet, protobuf-net bu tür bildirimleri gözlemleyecek ve saygı duyacaktır
Marc Gravell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.