Пользовательский XML-сериал DateTime - PullRequest
4 голосов
/ 20 ноября 2008

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

Я компилирую 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;
    }
}

Ответы [ 3 ]

2 голосов
/ 21 августа 2011

Не сериализуйте 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 */ }
}
0 голосов
/ 20 ноября 2008
0 голосов
/ 20 ноября 2008

Возможно, вы захотите использовать DateTimeOffset вместо чистого объекта DateTime.

...