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

6

protogen.exe 会为类型为 longproto2 消息字段生成此模式:

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不支持包括google.protobuf.Timestampproto3),因此不清楚如何在手动编码的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; }
}

什么是使用protobuf-net处理DateTime属性的正确方式?
2个回答

5

这取决于你想让数据在传输时是什么样子的。如果你想要一个 long 类型的时间戳(从 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;}

谢谢Marc。是的,我需要公共的DateTime类型属性,所以建议使用选项2或3。但是我不理解选项3,因为proto2不支持DateTime-- DateTime在线路上如何表示? - BaltoStar
@Balto 请查看 Bcl.Proto。基本上,protobuf-net 创造了一些东西。如果您需要 xplat,请使用长技巧(#2),在我看来。 - Marc Gravell
我假设 DateTime 的默认值是 ["1/1/0001 12:00:00 AM"] = DateTime.MinValue. 但是 DateTime DataFormat 呢? - BaltoStar
如果选择选项2,如何实现DateTime??可能使用long?吗? - BaltoStar

1

现在支持Timestamp类型:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接