RESTfulサービスのXSDスキーマがあります。 xsd.exe
ツールと組み合わせて使用してC#コードを生成すると、XSDのxs:date
は次のコードを生成します。
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
get {
return this.timeField;
}
set {
this.timeField = value;
}
}
XmlSerializer
を使用してXMLをオブジェクトにデシリアライズするとき、すべてがうまくいくようです。私が直面している問題は、サービスが日付がYYYY-MM-DD hh:mm:ss
としてフォーマットされることを期待し、XSD生成コードがYYYY-MM-DD
のみを生成するように見えることです。
XSDを手動でxs:dateTime
タイプに変更すると、生成されたC#コードは2010-08-20T20:07:03.915039Z
を生成します。
基本的に、シリアル化でYYYY-MM-DD hh:mm:ss
を生成するにはどうすればよいですか? XSDに何かすることはありますか、または生成されたC#コードを変更するためにできることはありますか?
過去に、日時のシリアル化を制御するために次のことを行いました。
以下に例を示します。
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); }
}
}
[XmlElement(DataType = "date")]
属性を使用して、必要に応じてDateTime
プロパティ値をフォーマットします。
MSDNから :
注意:
publicationdateフィールドに注釈を付ける属性には、DataTypeプロパティがあります。 .NET Frameworkには、xs:date型に完全に一致する型はありません。最も近いものはSystem.DateTimeで、日付と時刻のデータが保存されます。 DataTypeプロパティを「日付」として指定すると、XmlSerializerはDateTimeオブジェクトの日付部分のみをシリアル化します。
IXmlSerializable
インターフェースを実装するとうまくいくと思います。その後、オブジェクトのシリアル化と逆シリアル化の方法を制御できます。
ミリ秒部分のみをクリアする必要がある場合。参照する:
そして基本的に次のようなことをします:
startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond));
endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond));
これが次のようにシリアライズされることを確認できます。
<startDate>2015-10-31T12:13:04</startDate>
<endDate>2016-11-10T12:13:06</endDate>
私はまた、Beforeミリ秒をクリアすることを述べなければなりません:
var startDateTimeToUse = ssStartDateTime.ToUniversalTime();
var endDate = DateTime.Now.ToUniversalTime();
startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified);
endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);
この時点でシリアル化に影響があるかどうかはわかりません
上記の回答をご覧ください。ただし、値がnullでない場合(XML maxOccurs = 0など)にのみ出力が必要な場合は、次のようなものを利用できます。
private System.DateTime? someDateField;
public string someDate
{
get
{
return someDateField?.ToString("MM-dd-yyyy");
}
set
{
dobField = System.DateTime.Parse(value);
}
}