Пользовательский XML-сериал DateTime
Я хотел бы иметь возможность сериализовать 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;
}
}