В protobuf-net , я использую подход с градуированной шкалой (и действительно, он обрабатывает все это для вас, если вы просто используете DateTime
) - эквивалентный .proto выглядит примерно так:
message DateTime {
optional sint64 value = 1; // the offset (in units of the selected scale)
// from 1970/01/01
optional TimeSpanScale scale = 2 [default = DAYS]; // the scale of the
// timespan
enum TimeSpanScale {
DAYS = 0;
HOURS = 1;
MINUTES = 2;
SECONDS = 3;
MILLISECONDS = 4;
MINMAX = 15; // dubious
}
}
т.е. если DateTime
можно выразить в целых днях, я просто отправляю количество дней с 1970 года и т. д. плюс небольшой маркер к шкале. Это означает, что даты могут быть отправлены немного более эффективно, но на самом деле это не намного дороже для других масштабов.
Лично я бы не использовал ToBinary()
- я бы явно использовал смещение известного масштаба из известной эпохи (такой как эпоха unix). Это делает его более переносимым между платформами. Но если вы отправляете (например) только смещение в миллисекунду, то фиксированная шкала обычно будет более эффективной, чем шкала с переменной длиной. Нужны ли вам подписанные или неподписанные, зависит от того, нужны ли вам даты до вашей эпохи; -p