5

サーバーでもクライアント時間でもない特定のタイムゾーンで DateTime をシリアライズできるようにしたいと考えています。基本的に、どの時間帯でも構いません。.Net2.0 Web サービスで DateTime シリアライゼーションをオーバーライドすることは可能ですか?

xsd.exeでxmlschemaをコンパイルするので、XmlSchemaImporterを使ってみました。

OnSerialize の例は、値の変更を示していますが、出力形式の変更は示していません。

XmlSchemaImporter を gac にロードし、xsd.exe を実行し、必要なクラスを持つコードを生成しました...しかし、そのクラスは属性であり、反映できません。

[InvalidOperationException: タイプ Cuahsi.XmlOverrides.W3CDateTime のメンバー 'metadataDateTime' をシリアル化できません。XmlAttribute/XmlText を使用して複合型をエンコードすることはできません。]

生成コード

[System.Xml.Serialization.XmlAttributeAttribute()]
public Cuahsi.XmlOverrides.W3CDateTime dateTime {
    get {
        return this.dateTimeField;
    }
    set {
        this.dateTimeField = value;
    }
}

XmlSchemaImporter

public class ImportW3CTime : 
  System.Xml.Serialization.Advanced.SchemaImporterExtension
{
    public override string ImportSchemaType(string name, string ns,
        XmlSchemaObject context, XmlSchemas schemas,
        XmlSchemaImporter importer, CodeCompileUnit compileUnit, 
        CodeNamespace mainNamespace, CodeGenerationOptions options,
        CodeDomProvider codeProvider)
    {
        if (XmlSchema.Namespace == ns)
        {
            switch (name)
            {
                case "dateTime":
                    string codeTypeName = typeof(W3CDateTime).FullName;
                    CodeTypeDeclaration cls = 
                        new CodeTypeDeclaration("W3CDateTime");                     
                    cls.IsStruct = true;
                    cls.Attributes = MemberAttributes.Public;
                    cls.BaseTypes.Add("dateTime");
                    mainNamespace.Types.Add(cls);
                    return codeTypeName;
                default: return null;
            }
        }
        else { return null; }
    }
}

補遺 1: DateTimeoffset にうんざりしていて、クラスが次のようにタグ付けされている場合でもエラーが発生します。

[System.Xml.Serialization.XmlAttributeAttribute(DataType = "dateTime")]
public System.DateTimeOffset metadataDateTime {
    get {
        return this.metadataDateTimeField;
    }
    set {
        this.metadataDateTimeField = value;
    }
}
4

3 に答える 3

2

直接シリアル化DateTimeOffsetするのではなく、代わりに文字列をシリアル化します。

// Don't serialize this one
[System.Xml.Serialization.XmlIgnore]
public System.DateTimeOffset metadataDateTime
{
    get { ... }
    set { ... }
}


// Serialize this one instead
[System.Xml.Serialization.XmlAttribute("metadataDateTime")]
public string metadataDateTimeXml
{
    get { /* format metadataDateTime to custom format */ }
    set { /* parse metadataDateTime from custom format */ }
}
于 2011-08-21T18:32:48.150 に答える
0

純粋な DateTime オブジェクトの代わりに DateTimeOffset を使用したい場合があります。

于 2008-11-20T19:45:26.400 に答える
-1

これは2日前に議論されました。これはあなたのためにそれをしますか?

クラス プロパティの 1 つが DateTime である C# クラスを XML にシリアル化します。このプロパティを ISO 形式にする方法は?

于 2008-11-20T19:46:15.590 に答える