Dwing XmlSerializer om DateTime te serialiseren als ‘JJJJ-MM-DD uu:mm:ss’

Ik heb een XSD-schema voor een RESTful-service. Bij gebruik in combinatie met de tool xsd.exeom C#-code te genereren, genereert xs:datevan XSD de volgende code:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
    get {
        return this.timeField;
    }
    set {
        this.timeField = value;
    }
}

Bij het deserialiseren van XML naar objecten met behulp van XmlSerializerlijkt alles goed te gaan. Het probleem waarmee ik te maken heb, is dat de service verwacht dat datums worden geformatteerd als YYYY-MM-DD hh:mm:ssen dat de door XSD gegenereerde code alleen YYYY-MM-DD.

Als ik XSD handmatig wijzig naar het type xs:dateTime, produceert de gegenereerde C#-code: 2010-08-20T20:07:03.915039Z.

Hoe dwing ik in het algemeen serialisatie om YYYY-MM-DD hh:mm:sste produceren? Kan ik iets doen aan XSD of kan ik iets doen om de gegenereerde C#-code te wijzigen?


Antwoord 1, autoriteit 100%

In het verleden heb ik het volgende gedaan om datetime-serialisatie te controleren:

  • Negeer de eigenschap DateTime.
  • Maak een dummy string-eigenschap die serialiseert/deserialiseert zoals ik dat wil

Hier is een voorbeeld:

public class SomeClass
{
    [XmlIgnore]
    public DateTime SomeDate { get; set; }
    [XmlElement("SomeDate")]
    public string SomeDateString
    {
        get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
        set { this.SomeDate = DateTime.Parse(value); }
    }
}

Antwoord 2, autoriteit 43%

Gebruik het kenmerk [XmlElement(DataType = "date")]om uw eigenschapswaarde DateTimenaar wens op te maken.

Van MSDN:

Opmerking:
Het attribuut dat het veld publicatiedatum annoteert heeft een
DataType-eigenschap. Er is geen type in het .NET Framework dat overeenkomt
het type xs:date volledig. De dichtstbijzijnde match is System.DateTime,
waarin datum- en tijdgegevens worden opgeslagen. De eigenschap DataType opgeven als a
“date” zorgt ervoor dat de XmlSerializer alleen de datum serialiseert
onderdeel van het DateTime-object.


Antwoord 3, autoriteit 3%

Als u alleen het milliseconde-gedeelte hoeft te wissen. Raadpleeg:

Milliseconden afkappen van een .NET DateTime

En doe eigenlijk zoiets als:

 startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond));
  endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond));

Ik kan bevestigen dat dit serialiseert naar:

           <startDate>2015-10-31T12:13:04</startDate>
            <endDate>2016-11-10T12:13:06</endDate>

Ik moet ook aangeven dat Voordatde milliseconden worden gewist, ik dit doe:

           var startDateTimeToUse = ssStartDateTime.ToUniversalTime();
            var endDate = DateTime.Now.ToUniversalTime();
            startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified);
            endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);

Waarvan ik op dit moment niet weet of het enig effect heeft op de serialisatie of niet


Antwoord 4, autoriteit 2%

Ik geloof dat het implementeren van een IXmlSerializable-interface een succes zal zijn. U kunt dan bepalen hoe u uw object serialiseert en deserialiseert.


Antwoord 5

zie antwoorden hierboven, maar om toe te voegen– als u alleen uitvoer wilt wanneer de waarde niet-null is (bijv. XML maxOccurs=0), kunt u zoiets als dit gebruiken:

private System.DateTime? someDateField;
public string someDate
{
    get
    {
        return someDateField?.ToString("MM-dd-yyyy");
    }
    set
    {
        dobField = System.DateTime.Parse(value);
    }
}

Antwoord 6

Misschien heb ik een andere optie.
Wanneer u uw DateTime instelt, trekt u gewoon het aantal tikken van alles af na de seconden, zoals:

   public DateTime Dt
        {
        get => _dt;
        set
            {
            _dt = value;
            long elapsedTicks = _dt.Ticks - new DateTime(_dt.Year, _dt.Month, _dt.Day, _dt.Hour, _dt.Minute, _dt.Second).Ticks;
            TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
            _dt = _dt.Subtract(elapsedSpan);
            }
        }
private DateTime _dt = default(DateTime);

Op die manier worden de milliseconden niet gebruikt als je je DateTime (Dt) serialiseert en heb je een waarde hh:mm:ss, dat is tenminste wat het me gaf. Op die manier hoeft u niets aan uw XML-definitie te wijzigen.

Other episodes