2008-11-20 2 views
4

Я хотел был бы иметь возможность Сериализовать DateTime с определенным часовым поясом, который не является сервером, и не является клиентом. В принципе, любой часовой пояс. Можно ли переопределить сериализацию DateTime, в .Net2.0 webservices?Custom DateTime XML Serialization

Я компилирую xmlschema с помощью xsd.exe, поэтому я попытался использовать XmlSchemaImporter.

Примеры OnSerialize показывают изменение значений, но не изменяют формат вывода.

XmlSchemaImporter, загрузил его в gac, запустил xsd.exe и сгенерировал код, который имеет класс, который я хочу ... но этот класс является атрибутом, который в конечном итоге не может быть отражен.

[InvalidOperationException: Может не сериализации член 'metadataDateTime' из типа Cuahsi.XmlOverrides.W3CDateTime. 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 */ } 
}