簡體   English   中英

自定義DateTime XML序列化

[英]Custom DateTime XML Serialization

我希望能夠使用不是服務器的特定時區(也不是客戶端時間)來序列化DateTime。 基本上是任何時區。 .Net2.0 Webservices中是否可以覆蓋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;
    }
}

不要直接序列化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 */ }
}

您可能要使用DateTimeOffset而不是純DateTime對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM