Oto kilka pomysłów na podstawie mojego doświadczenia z protokołem przewodowym podobnym do buforów protokołów.
datetime (sekundy precyzja)
datetime (milisekund precyzja)
Myślę, że odpowiedź na te dwa byłyby takie same, to po prostu zwykle do czynienia z mniejszym zakresie liczb w przypadku precyzji sekund.
Sint64/sfixed64 służy do przechowywania przesunięcia w sekundach/milisekundach od dobrze znanej epoki, takiej jak północ GMT 1/1/1970. To, jak obiekty Date są internally represented in Java. Jestem pewien, że istnieją analogi w Pythonie i C++.
Jeśli potrzebujesz informacji o strefie czasowej, podaj datę/czas w ujęciu UTC i modeluj odpowiednią strefę czasową jako oddzielne pole tekstowe. W tym celu można użyć identyfikatorów z Olson Zoneinfo database, ponieważ stało się to nieco standardowe.
W ten sposób można uzyskać kanoniczną reprezentację daty/czasu, ale można również zlokalizować w dowolnej strefie czasowej.
dziesiętne ze stałą precyzją
moja pierwsza myśl jest użycie ciąg podobny do tego, jak się konstruuje dziesiętne obiekty z pakietu dziesiętnych Pythona. Przypuszczam, że może to być nieefektywne w stosunku do jakiejś reprezentacji liczbowej.
Możliwe, że istnieją lepsze rozwiązania w zależności od domeny, z którą współpracujesz. Na przykład, jeśli modelujesz wartość pieniężną, być może uda Ci się uciec za pomocą uint32/64, aby przekazać wartość w centach, w przeciwieństwie do ułamkowych kwot w dolarach.
Istnieje również kilka przydatnych sugestii w this thread.
dziesiętne o zmiennej precyzji
Nie Protocol Zderzaki już wspierać ten z pływakiem/podwójnych typów skalarnych? Może źle zrozumiałem tę kwestię.
W każdym razie, jeśli potrzebowałeś obejść te typy skalarne, możesz kodować używając IEEE-754 do uint32 lub uint64 (odpowiednio float vs double). Na przykład Java allows you to extract the IEEE-754 representation i vice versa z obiektów Float/Double. Istnieją analogiczne mechanizmy w C++/Pythonie.
wiele wartości bool (jeśli masz dużo z nich wygląda jak będziesz miał 1-2 bajtów narzutu dla każdego z nich ze względu na ich tagów.
Jeżeli jesteś zaniepokojony marnowaniem bajtów na przewodzie, można użyć bit-masking techniques, aby skompresować wiele booleans w jednym uint32 lub uint64.
Ponieważ nie ma pierwszej klasy wsparcia w buforze protokołów, wszystkie te techniki wymagają trochę dżentelmenów " umowa między agentami . Być może użycie konwencji nazewnictwa na twoich polach, takich jak "_dttm" lub "_mask", pomogłoby komunikować się, gdy dane pole zawiera dodatkową semantykę kodowania wykraczającą poza domyślne zachowanie buforów protokołów.