Serialización XML de fecha y hora personalizada
Me gustaría poder serializar una fecha y hora con una zona horaria específica que no sea el servidor ni la hora del cliente. Básicamente, cualquier zona horaria. ¿Es posible anular la serialización de DateTime en los servicios web .Net2.0?
Compilé un xmlschema usando xsd.exe, así que intenté usar XmlSchemaImporter.
Los ejemplos de OnSerialize muestran cambios de valor, pero no cambios en el formato de salida.
XmlSchemaImporter, lo cargó en el gac, ejecutó xsd.exe y generó el código que tiene la clase que quiero ... pero esa clase es un atributo, que no puede reflejarse.
[InvalidOperationException: no se puede serializar el miembro 'metadataDateTime' del tipo Cuahsi.XmlOverrides.W3CDateTime. XmlAttribute / XmlText no se puede usar para codificar tipos complejos.]
Código generado
[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; }
}
}
Anexo 1: Acabo de cansar DateTimeoffset, y eso todavía causa un error cuando la clase se etiqueta como:
[System.Xml.Serialization.XmlAttributeAttribute(DataType = "dateTime")]
public System.DateTimeOffset metadataDateTime {
get {
return this.metadataDateTimeField;
}
set {
this.metadataDateTimeField = value;
}
}