protobuf-net:如何在C#中表示DateTime?

时间:2016-09-24 01:15:51

标签: c# datetime timestamp protocol-buffers protobuf-net

protogen.exeproto2类型的long消息字段生成此模式:

private long _Count = default(long);
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"Count", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
[global::System.ComponentModel.DefaultValue(default(long))]
public long Count
{
  get { return _Count; }
  set { _Count = value; }
}

但由于proto2不包含日期时间类型(且protobuf-net不支持proto3,其中包含google.protobuf.Timestamp),但不清楚如何在手动编码的C#proto对象中表示DateTime

这可能是错误的:

private DateTime _When = DateTime.MinValue;
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"When", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue(DateTime.MinValue)]
public DateTime When
{
  get { return _When; }
  set { _When = value; }
}

装饰DateTime属性以便与protobuf-net一起使用的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

这取决于你想要它在电线上的样子。如果你想要它是long(delta到epoch),那么:那样做。例如:

[ProtoMember(...)] public long Foo {get;set;}

如果您希望它在线上long和代码中的DateTime:请执行此操作:

 public DateTime Foo {get;set;}
 [ProtoMember(...)] private long FooSerialized {
    get { return DateTimeToLong(Foo); }
    set { Foo = LongToDateTime(value); }
  }

如果您不在乎并且只想存储DateTime,请执行以下操作:

[ProtoMember(...)] public DateTime Foo {get;set;}

答案 1 :(得分:1)

现在支持Timestamp类型:

[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"When",
    DataFormat = global::ProtoBuf.DataFormat.WellKnown)]
public DateTime When {get;set;}