2008-09-19 10 views
11

Ich habe eine C# -Klassendatei erstellt, indem Sie eine XSD-Datei als Eingabe verwenden. Eine meiner Eigenschaften dieses wie folgt aussehen:Serialisierung DateTime zu Zeit ohne Millisekunden und gmt

private System.DateTime timeField; 

[System.Xml.Serialization.XmlElementAttribute(DataType="time")] 
public System.DateTime Time { 
    get { 
     return this.timeField; 
    } 
    set { 
     this.timeField = value; 
    } 
} 

Wenn serialisiert, wird der Inhalt der Datei sieht nun wie folgt aus:

<Time>14:04:02.1661975+02:00</Time> 

Ist es möglich, mit XmlAttributes auf dem Grundstück, es zu haben, machen ohne die Millisekunden und der GMT-Wert so?

<Time>14:04:02</Time> 

Ist dies möglich, oder muss ich zusammen eine Art von xsl/hacken XPath-ersetzen-Magie, nachdem die Klasse serialisiert wurde?

Es ist keine Lösung, das Objekt in String zu ändern, da es wie eine DateTime im Rest der Anwendung verwendet wird und es uns ermöglicht, mithilfe der XmlSerializer.Serialize() -Methode eine XML-Repräsentation aus einem Objekt zu erstellen .

Der Grund, warum ich die zusätzlichen Informationen aus dem Feld entfernen muss, ist, dass das empfangende System nicht den w3c-Standards für den Zeit-Datentyp entspricht.

+0

Blick auf http://stackoverflow.com/questions/3534525/force-xmlserializer-to-serialize-datetime-as-yyyy-mm-dd-hhmmss – TNT

Antwort

13

Sie könnten eine Zeichenfolgeneigenschaft erstellen, die die Übersetzung in/aus Ihrem timeField-Feld ausführt, und stattdessen das Serialisierungsattribut auf die echte DateTime-Eigenschaft setzen, die der Rest der Anwendung verwendet.

+0

Ich musste heute genau dasselbe machen :) – leppie

+0

Funktioniert das auch, wenn wir später die gleiche Datei deserialisieren müssen? – Espo

+0

Espo: Ja wird es, siehe Code in meiner Antwort :) –

21

Setzen Sie [XmlIgnore] in die Eigenschaft Time.

Dann fügen Sie eine neue Eigenschaft:

[XmlElement(DataType="string",ElementName="Time")] 
public String TimeString 
{ 
    get { return this.timeField.ToString("yyyy-MM-dd"); } 
    set { this.timeField = DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); } 
} 
+2

Ist '" yyyy-MM-dd "' die richtige Formatzeichenfolge für ein Zeitfeld? Während diese Lösung für mich nicht out of the box funktionierte, führte es mich zu einem, das tat. Ich musste '" HH: mm: ss "' verwenden, und ich habe von meinem 'dateField' wie folgt 'get {return this.dateField.ToString (" HH: mm: ss "); } ' – OutstandingBill