xmlelement xmlattribute serialize serializar objeto into deserializar c# web-services .net-2.0 xml-serialization asmx

c# - xmlattribute - Serialización personalizada de DateTime XML



xml serialization c# (3)

Me gustaría poder serializar un DateTime con un huso horario específico que no sea el servidor, ni tampoco la hora del cliente. Básicamente, cualquier zona horaria. ¿Es posible anular la serialización DateTime en .Net2.0 webservices?

Recopilo un xmlschema usando xsd.exe, así que hice un intento usando XmlSchemaImporter.

Los ejemplos de OnSerialize muestran cambios de valores, pero no cambios en el formato de salida.

XmlSchemaImporter, lo cargué en el gac, ejecuté xsd.exe y generé el código que tiene la clase que quiero ... pero esa clase es un atributo, que al final no se puede reflejar.

[InvalidOperationException: no se puede serializar el miembro ''metadataDateTime'' de 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; } } }

Addendum 1: Me cansé de DateTimeoffset, y todavía causa un error cuando la clase está etiquetada como:

[System.Xml.Serialization.XmlAttributeAttribute(DataType = "dateTime")] public System.DateTimeOffset metadataDateTime { get { return this.metadataDateTimeField; } set { this.metadataDateTimeField = value; } }


Es posible que desee utilizar DateTimeOffset en lugar de un objeto DateTime puro.



No serialice DateTimeOffset directamente, sino serialice una cadena en su lugar:

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