4

任意のタイムゾーンのDateTimesを取得するために作業しています。DateTimeOffset、文字列、およびXmlElement属性を使用しています。これを行うと、次のエラーが発生します。

[InvalidOperationException:'dateTime'はXmlElementAttribute.DataTypeプロパティの無効な値です。dateTimeをSystem.Stringに変換できません。]
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model、String ns、ImportContext context、String dataType、XmlAttributes a、Boolean repeats、Boolean openModel、RecursionLimiter limiter)+450

[InvalidOperationException:タイプ'System.String'を反映するエラーがありました。]
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model、String ns、ImportContext context、String dataType、XmlAttributes a、Boolean repeats、Boolean openModel、RecursionLimiter limiter) +1621
System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor、FieldModel model、XmlAttributes a、String ns、Type choiceIdentifierType、Boolean rpc、Boolean openModel、RecursionLimiter limiter)+8750
System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping( 、FieldModelモデル、XmlAttributes a、String ns、RecursionLimiterリミッター)+139
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMappingマッピング、StructModelモデル、ブール型openModel、String typeName、RecursionLimiterリミッター)+1273

[InvalidOperationException:プロパティ'creationTimeX'を反映するエラーが発生しました。]..。

コード:

 [System.Xml.Serialization.XmlElement(ElementName = "creationTime",
      DataType="dateTime")]
 public string creationTimeX
    {
        get
        {
            return this.creationTimeField.ToString("yyyy-MM-ddTHH:mm:sszzz");
        }
        set
        {
            DateTimeOffset.TryParse(value, out this.creationTimeField);
        }
    }

[System.Xml.Serialization.XmlIgnoreAttribute()]
public System.DateTimeOffset creationTime
{
    get {
        return this.creationTimeField;
    }
    set {
        this.creationTimeField = value;
    }
}
4

6 に答える 6

3

これは私のために働いたものです

private const string DateTimeOffsetFormatString = "yyyy-MM-ddTHH:mm:sszzz";
private DateTimeOffset eventTimeField;

[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public string eventTime
{
    get { return eventTimeField.ToString(DateTimeOffsetFormatString); }
    set { eventTimeField = DateTimeOffset.Parse(value); }
}
于 2012-02-21T15:09:10.733 に答える
2

日付と UTC のシリアル化に関するこの StackOverflow の質問をご覧ください。

.Net Framework 3.5/SQL Server 2008 での DateTime シリアル化のベスト プラクティス

シリアル化を行うためだけに特別なプロパティを作成する必要はありません。

于 2008-11-21T01:20:46.177 に答える
1

DateTime を long としてシリアル化することをお勧めします (これは、実際の値を格納するために実装が内部で使用するものです)。

を使用DateTime.Ticksして値を取得でき、長い ( ) を取るコンストラクターがありますInt64

于 2008-11-21T20:54:46.730 に答える
1

XmlConvert.ToDateTimeOffset() および .ToString() メソッドを使用して、XmlSerializer 回避策プロパティで DateTimeOffset を正しくシリアル化および逆シリアル化します。

こちらの Microsoft Connect 記事の完全なサンプルと、残念ながら Microsoft がこの見落としを修正しないことの確認 (XmlSerializer によってプリミティブ型としてネイティブにサポートされているはずです)。

https://connect.microsoft.com/VisualStudio/feedback/details/288349/datetimeoffset-is-not-serialized-by-a-xmlserializer

于 2014-04-10T11:07:40.600 に答える
0

プロパティのデータ型creationTimeXは文字列ですが、XmlSerializationデータ型はDateTimeです。そのため、その例外が発生します。

これは、データ型をに変更することで修正できますDateTime

また、任意のタイムゾーンの現在時刻を発行するには、を適用しDateTime.Now.ToUniveralTime()て適切なDateTimeFormatパターンを適用する必要があります。

http://msdn.microsoft.com/en-us/library/k494fzbf.aspx

于 2008-11-21T00:53:20.540 に答える