Custom DateTime XML Serialization
Ich möchte ein DateTime mit einer bestimmten Zeitzone serialisieren können, die weder der Server noch die Client-Zeit ist. Grundsätzlich jede Zeitzone. Ist es möglich, die DateTime-Serialisierung in .Net2.0-Webservices zu überschreiben?
Ich kompiliere ein XML-Schema mit xsd.exe, also habe ich versucht, XmlSchemaImporter zu verwenden.
Die OnSerialize-Beispiele zeigen Wertänderungen, jedoch keine Änderungen am Ausgabeformat.
XmlSchemaImporter, lud es in den gac, ließ xsd.exe laufen und erzeugte Code mit der gewünschten Klasse ... aber diese Klasse ist ein Attribut, das am Ende nicht reflektiert werden kann.
[InvalidOperationException: Member 'metadataDateTime' vom Typ Cuahsi.XmlOverrides.W3CDateTime kann nicht serialisiert werden. XmlAttribute / XmlText kann nicht zum Codieren komplexer Typen verwendet werden.]
Generierter 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: Ich habe gerade DateTimeoffset müde, und das verursacht immer noch einen Fehler, wenn die Klasse wie folgt markiert ist:
[System.Xml.Serialization.XmlAttributeAttribute(DataType = "dateTime")]
public System.DateTimeOffset metadataDateTime {
get {
return this.metadataDateTimeField;
}
set {
this.metadataDateTimeField = value;
}
}