2016-09-24 31 views
1

protogen.exe生成此圖案用於long類型的proto2消息字段:protobuf-net:如何在C#中表示DateTime?

private long _Count = default(long); 
[global::ProtoBuf.ProtoMember(1, IsRequired = false, [email protected]"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)還不清楚如何表示DateTime在手動編碼的C#proto對象中。

這可能是錯誤的:

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

什麼是裝飾使用DateTime性能與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;} 
+0

謝謝Marc。是的,我需要DateTime類型的公共屬性,所以建議選擇2或3。但是我不理解選項3,因爲proto2不支持DateTime - 如何在線上表示DateTime? – BaltoStar

+0

@Balto見Bcl.Proto。基本上,protobuf網使一些東西。如果你需要xplat:使用長技巧(#2),IMO –

+0

我假設'DateTime'默認值是'[「1/1/0001 12:00:00 AM」]'='DateTime.MinValue'。但是'DateTime DataFormat'呢? – BaltoStar

0

現在支持的Timestamp類型:

[global::ProtoBuf.ProtoMember(1, IsRequired = false, [email protected]"When", 
    DataFormat = global::ProtoBuf.DataFormat.WellKnown)] 
public DateTime When {get;set;} 
相關問題