2008-11-20 63 views
4

我希望能夠序列化具有不是服務器的特定時區的DateTime,也不是客戶端時間。基本上,任何時區。 是否可以在.Net2.0 webservices中重寫DateTime序列化?自定義日期時間XML序列化

我使用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; 
    } 
} 
+0

你有沒有找到一個解決辦法? – 2011-01-30 06:38:05

回答

0

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

+0

很高興知道它在2.0 SP1 ... 仍然導致與自動生成xsd.exe錯誤 – 2008-11-20 20:00:52

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 */ } 
}