如何通过 ProtoBuf-net 使用 DateTimeKind 选项序列化 DateTime 字段

Uma*_*y S 4 c# datetime protobuf-net

如何通过 ProtoBuf 使用 DateTimeKind 选项序列化日期时间字段。反序列化时,我想要带有 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); }   
} 
Run Code Online (Sandbox Code Playgroud)

现在考虑我的情况,我的应用程序有许多这样的日期时间字段。我需要一个通用解决方案来实现这一点,而不是在所有地方添加额外的属性。如果可能,请解释如何使用示例 C# 逻辑实现此目的。提前致谢。

fel*_*x-b 5

在序列化或反序列化任何内容之前包含此代码以运行:

RuntimeTypeModel.Default.IncludeDateTimeKind = true;
Run Code Online (Sandbox Code Playgroud)

现在你的合同可以像这样简单(不需要将属性加倍):

[ProtoMember(3)]           
public DateTime DateTimeValue { get; set; }
Run Code Online (Sandbox Code Playgroud)

并且DateTimeKind会自动写入和读取的值。

兼容性问题

值得注意的是,原始协议缓冲区规范不包括DateTimeKind(它特定于 .NET)——请参阅protobuf-net 不会正确反序列化 DateTime.Kind。选择加入支持序列化的DateTimeKind添加在protobuf网V2.1.0。

如果你与另一个系统交换这些消息,除非另一端使用 protobuf-net 并设置IncludeDateTimeKindtrue.