2016-09-24 1 views
1

protogen.exe erzeugt dieses Muster für eine proto2 Nachricht Feld vom Typ long:protobuf-net: Wie wird DateTime in C# dargestellt?

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

aber als proto2 enthält keinen Datum Zeittyp (und protobuf-net nicht proto3 unterstützt die google.protobuf.Timestamp enthält) nicht klar ist, wie zu vertreten DateTime im manuell codierten C# Proto-Objekt.

Dies ist wahrscheinlich falsch:

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

Was ist der richtige Weg DateTime Eigenschaften für die Verwendung mit protobuf-net zu dekorieren ist?

Antwort

1

Es hängt davon ab, wie es auf der Leitung aussehen soll. Wenn Sie wollen, dass es ein long (Delta in die Epoche) ist, dann: tun Sie das. Zum Beispiel:

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

Wenn Sie es wünschen ein long auf dem Draht und ein DateTime in Ihrem Code sein: das tun:

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

Wenn Sie nicht kümmern und wollen nur speichern, DateTime, das tun:

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

Danke Marc. Ja, ich benötige öffentliche Eigenschaft vom Typ DateTime, daher wird Option 2 oder 3 empfohlen. Aber ich verstehe Option 3 nicht, weil Proto2 DateTime nicht unterstützt - wie wird die DateTime auf dem Draht dargestellt? – BaltoStar

+0

@Balto siehe Bcl.Proto. im Prinzip macht Protobuf-net etwas aus. Wenn du xplat brauchst: benutze den langen Trick (# 2), IMO –

+0

Ich nehme an, 'DateTime' ist der Standardwert' ["1/1/0001 12:00:00 AM"] '=' DateTime.MinValue'. Aber was ist mit 'DateTime DataFormat'? – BaltoStar

0

Der Timestamp Typ wird nun unterstützt:

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