Как сериализовать поле DateTime с опцией DateTimeKind через ProtoBuf-net - PullRequest
3 голосов
/ 03 июля 2019

Как сериализовать поле даты и времени с опцией DateTimeKind через ProtoBuf.При десериализации я хочу это поле даты и времени с опцией DateTimeKind.

Я знаю, что мы можем достичь этого, добавив еще одно свойство для преобразования десериализованного значения в формат UTC.

Например, у меня есть одно поле даты и времени, называемое UtcDateTime.значение в формате UTC.Когда сериализуете и десериализуете это значение, я получаю правильный результат, но ему не удалось получить опцию даты и времени.

Вот мой пример кода:

[ProtoIgnore]                
public DateTime UtcDateTime { get; set; }

[ProtoMember(3)]           
public DateTime DateTimeValue           
{
    get { return UtcDateTime ; }
    set { UtcDateTime = DateTime.SpecifyKind(value, DateTimeKind.Utc); }   
} 

Теперь рассмотрим мой случай, в моем приложении много полей даты и времени, подобных этому.Вместо того, чтобы добавлять дополнительные свойства во всех местах, мне нужно одно общее решение для достижения этой цели.Если возможно, пожалуйста, объясните, как этого добиться с помощью примера логики C #.Заранее спасибо.

1 Ответ

2 голосов
/ 03 июля 2019

Включите этот код для запуска перед сериализацией или десериализацией чего-либо:

RuntimeTypeModel.Default.IncludeDateTimeKind = true;

Теперь ваш контракт может быть таким простым (нет необходимости удваивать свойства):

[ProtoMember(3)]           
public DateTime DateTimeValue { get; set; }

И значение DateTimeKind будет записываться и считываться автоматически.

Проблема совместимости

Стоит отметить, что оригинальная спецификация протокольных буферов не включает DateTimeKind (она специфична для .NET) - см. protobuf-net не десериализует DateTime.Kind правильно .Поддержка протокола сериализации DateTimeKind была добавлена ​​ в protobuf-net v2.1.0.

Если вы обмениваетесь этими сообщениями с другой системой, она не будет работать, если другой конец не используетprotobuf-net и устанавливает IncludeDateTimeKind в true.

...