【问题标题】:protobuf-net : how to represent DateTime in C#?protobuf-net:如何在 C# 中表示 DateTime?
【发布时间】:2017-02-01 22:50:35
【问题描述】:

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 不支持包含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; }
}

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

【问题讨论】:

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


    【解决方案1】:

    这取决于您希望它在电线上的样子。如果您希望它成为long(增量到纪元),那么:这样做。例如:

    [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;}
    

    【讨论】:

    • 谢谢马克。是的,我需要 DateTime 类型的公共属性,因此建议使用选项 2 或 3。但我不理解选项 3,因为 proto2 不支持 DateTime - DateTime 是如何在线路上表示的?
    • @Balto 查看 Bcl.Proto。基本上,protobuf-net 组成了一些东西。如果您需要 xplat:使用长技巧 (#2),IMO
    • 我假设DateTime 默认值为["1/1/0001 12:00:00 AM"] = DateTime.MinValue。但是DateTime DataFormat 呢?
    • 另外,如果使用选项 2 如何实现 DateTime? ?可能是long? ?
    【解决方案2】:

    现在支持Timestamp 类型:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多