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

C# 如何通过ProtoBuf net使用DateTimeKind选项序列化DateTime字段,c#,datetime,protobuf-net,C#,Datetime,Protobuf Net,如何通过ProtoBuf使用DateTimeKind选项序列化日期时间字段。反序列化时,我希望该日期时间字段带有DateTimeKind选项 我知道我们可以通过添加一个附加属性来转换UTC格式的反序列化值来实现这一点 例如,我有一个名为UtcDateTime的日期时间字段。它的值采用UTC种类格式。当序列化和反序列化这个值时,我得到了正确的结果,但它无法检索日期时间种类选项 这是我的示例代码: [ProtoIgnore] public DateTime UtcDa

如何通过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); }   
} 

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

在序列化或反序列化任何内容之前,包括要运行的代码:

RuntimeTypeModel.Default.IncludeDateTimeKind=true;
现在,您的合同可以如此简单(无需将财产翻倍):

[原成员(3)]
公共日期时间日期时间值{get;set;}
DateTimeKind
的值将自动写入和读取

兼容性问题 值得注意的是,原始的协议缓冲区规范不包括
DateTimeKind
(它特定于.NET)--请参阅。protobuf net v2.1.0中提供了对序列化
DateTimeKind
的选择性加入支持

如果您与另一个系统交换这些消息,则除非另一端使用protobuf net并将
IncludeDateTimeKind
设置为
true

澄清:“协议缓冲区”规范根本不涉及此问题;protobuf net在某个时候添加了这一点,但建议使用已知的类型(使用DataFormat.WellKnown;这使用较新的“Timestamp”布局);众所周知的类型也不支持任何“种类”的概念