5

I would like to be able to Serialize a DateTime with a specific Time Zone that is not the server, nor is it client time. Basically, any time zone. Is it possible to override the DateTime serialization, in .Net2.0 webservices?

I compile an xmlschema using xsd.exe, so I made an attempt using XmlSchemaImporter.

The OnSerialize examples show value changes, but not changes to the output format.

XmlSchemaImporter, loaded it into the gac, ran xsd.exe, and generated code that has the class I want... but that class is an attribute, which end up not being able to be reflected.

[InvalidOperationException: Cannot serialize member 'metadataDateTime' of type Cuahsi.XmlOverrides.W3CDateTime. XmlAttribute/XmlText cannot be used to encode complex types.]

Generated code

[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; }
    }
}

Addendum 1: I just tired DateTimeoffset, and that still causes an error when the class is tagged like:

[System.Xml.Serialization.XmlAttributeAttribute(DataType = "dateTime")]
public System.DateTimeOffset metadataDateTime {
    get {
        return this.metadataDateTimeField;
    }
    set {
        this.metadataDateTimeField = value;
    }
}
John Saunders
  • 160,644
  • 26
  • 247
  • 397
david valentine
  • 4,625
  • 2
  • 21
  • 15

3 Answers3

3

Don't serialize the DateTimeOffset directly, but serialize a string instead:

// 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 */ }
}
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
0

You may want to use DateTimeOffset instead of a pure DateTime object.

silverbugg
  • 214
  • 2
  • 7
-1

This was discussed 2 days ago. Does this do it for you?

C# serializing Class to XML where one of class properties is DateTime. How to make this property in ISO format?

Community
  • 1
  • 1
Brian Genisio
  • 47,787
  • 16
  • 124
  • 167