Ecco alcune idee basate sulla mia esperienza con un protocollo filo simile a Protocol Buffers.
datetime (secondi precisione)
datetime (millisecondi di precisione)
Penso che la risposta a questi due sarebbe stato lo stesso, si sarebbe solo in genere a che fare con una gamma più ridotta di numeri nel caso della precisione dei secondi.
Utilizzare un sint64/sfixed64 per memorizzare l'offset in secondi/millisecondi da un'epoca ben nota come GMT 1/1/1970 di mezzanotte. Ecco come gli oggetti Date sono internally represented in Java. Sono sicuro che ci sono analoghi in Python e C++.
Se sono necessarie informazioni sul fuso orario, passare la data/l'ora in termini di UTC e modellare il fuso orario pertinente come un campo stringa separato. Per questo, è possibile utilizzare gli identificatori da Olson Zoneinfo database poiché è diventato piuttosto standard.
In questo modo si dispone di una rappresentazione canonica per data/ora, ma è possibile anche localizzarsi a qualsiasi fuso orario sia pertinente.
decimali con precisione fissa
Il mio primo pensiero è quello di utilizzare una stringa simile a come si costruisce oggetti decimale da pacchetto decimale di Python. Suppongo che potrebbe essere inefficiente rispetto ad alcune rappresentazioni numeriche.
Potrebbero esserci soluzioni migliori a seconda del dominio su cui si sta lavorando. Ad esempio, se stai modellando un valore monetario, forse puoi usare un uint32/64 per comunicare il valore in centesimi anziché importi in dollari frazionari.
Ci sono anche alcuni suggerimenti utili in this thread.
decimali con una precisione variabile
non Vuol buffer protocollo già supportano questo con galleggiante/doppio tipi scalari? Forse ho frainteso questo punto.
In ogni caso, se si ha la necessità di aggirare questi tipi scalari, è possibile codificare utilizzando IEEE-754 in uint32 o uint64 (float vs double rispettivamente). Ad esempio, Java allows you to extract the IEEE-754 representation e vice versa da oggetti Float/Double. Esistono meccanismi analoghi in C++/Python.
un sacco di valori bool (se avete un sacco di loro sembra che avrete 1-2 byte overhead per ciascuno di loro a causa di loro tag.
Se sei preoccupato per i byte sprecati sul filo, è possibile utilizzare bit-masking techniques per comprimere molti booleani in un singolo uint32 o uint64
Perché non c'è supporto di prima classe nei buffer di protocollo, tutte queste tecniche richiedono un po 'di gentlemen' contratto tra agenti . Forse l'utilizzo di una convenzione di denominazione sui campi come "_dttm" o "_mask" potrebbe aiutare a comunicare quando un determinato campo ha una semantica di codifica aggiuntiva oltre al comportamento predefinito dei buffer del protocollo.