Ik heb een XSD-schema voor een RESTful-service. Bij gebruik in combinatie met de tool xsd.exe
om C#-code te genereren, genereert xs:date
van 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 XmlSerializer
lijkt 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:ss
en 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:ss
te 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 DateTime
naar wens op te maken.
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.