如何通过ProtoBuf-net

时间:2019-07-03 05:10:47

标签: 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); }   
} 

现在考虑我的情况,我的应用程序具有许多这样的日期时间字段。我不需要在所有地方添加其他属性,而需要一个通用的解决方案来实现这一目标。如果可能,请说明如何使用示例C#逻辑实现此目的。预先感谢。

1 个答案:

答案 0 :(得分:2)

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

RuntimeTypeModel.Default.IncludeDateTimeKind = true;

现在您的合同可以像这样简单(无需将属性翻倍):

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

DateTimeKind的值将被自动写入和读取。

兼容性问题

值得注意的是,原始的协议缓冲区规范不包括DateTimeKind(它特定于.NET)-请参见protobuf-net does not deserialize DateTime.Kind correctly。在protobuf-net v2.1.0中,added对序列化DateTimeKind的选择加入支持。

如果您与其他系统交换这些消息,则除非另一端使用protobuf-net并将IncludeDateTimeKind设置为true,否则它将无法正常工作。