В нашей кроссплатформенной сетевой системе с несколькими приложениями, разработанной в основном с движком Untiy, мы используем настраиваемую двоичную сериализацию, которая просто записывает примитивы с помощью BinaryWriter, а затем, используя зеркальную разметку, читает то же самое с помощью BinaryReader.Обратите внимание, что мы не используем BinaryFormatter и вместо этого полагаемся на заданные вручную двоичные макеты.Это работает очень хорошо для нас, так как мы имеем абсолютный контроль над тем, что и как сериализуется.Мы также используем примитивные представления объектов, а не какое-то форматирование строк, а затем анализируем, чтобы сохранить их компактность.Так, например, мы бы написали целое число напрямую, а не int.ToString ().Другими словами, компактный, читаемый человеком.Голый минимум, чтобы однозначно десериализовать что-то обратно к тому, что было сериализовано.
Недавно я наткнулся на NodaTime как «лучшее» (.NET, чем DateTime, DateTimeOffset, TimeZoneInfo) решение для работы со всеми вещами времени.Мне особенно нравится строгость типов, заставляющая меня думать, о чем именно я говорю (чистая универсальная временная линия против зигзагообразного безумия часовых поясов и т. Д.).
Я перенес наше управление датой и временем в NodaTimeно теперь у меня проблемы с сериализацией типов Noda в двоичный поток как примитивы.Кажется, нет «стандартной» модели доступа к свойствам.Некоторые типы имеют геттеры, такие как Duration.TotalNanoseconds, некоторые вместо этого имеют методы a'la ToXyz (), такие как Instant.ToUnixTicks ().Кстати, это то, что я предлагаю упростить: методы получения для чистого доступа к ожидаемому представлению типа и методы a'la ToXyz () для вычисления преобразования.Это отсутствует, например, для типа Instant.
Я попробовал подход форматирования / синтаксического анализа с шаблонами формата Noda, но по какой-то причине большинство предоставленных шаблонов формата не являются двусторонним или даже выдают исключение, что эти шаблоны не используютне поддерживает синтаксический анализ, только форматирование:
binaryWriter.Write(ZonedDateTimePattern.ExtendedFormatOnlyIso.Format(value));
ZonedDateTimePattern.ExtendedFormatOnlyIso.Parse(binaryReader.ReadString()).Value;
Что я хочу, так это просто:
binaryWriter.Write(instant.Nanoseconds);
instant = new Instant(binaryReader.ReadDouble());
binaryWriter.Write(duration.nanoseconds);
duration= new Duration(binaryReader.ReadDouble());
Какой согласованный, предпочтительно не форматирующий-на основе анализа-туда-обратноПодход можно использовать для достижения компактной двоичной сериализации всех типов NodaTime?
Если это невозможно, какие рекомендуются скоростные паттерны для каждого типа NodaTime?
PS: Шаблоны текста вВ примере кода явно говорится, что они не являются круговыми (только для формата, без разбора) в своем имени.Мой плохой.