Я хотел бы иметь возможность сериализовать DateTime с определенным часовым поясом, который не является ни сервером, ни временем клиента. В принципе, любой часовой пояс. Можно ли переопределить сериализацию DateTime в веб-сервисах .Net2.0?
Я компилирую xmlschema с помощью xsd.exe, поэтому я попытался использовать XmlSchemaImporter.
Примеры OnSerialize показывают изменения значений, но не изменения формата вывода.
XmlSchemaImporter, загрузил его в gac, запустил xsd.exe и сгенерировал код с нужным мне классом ... но этот класс является атрибутом, который в конечном итоге не может быть отражен.
[InvalidOperationException: Cannot serialize member 'metadataDateTime' of type Cuahsi.XmlOverrides.W3CDateTime. XmlAttribute/XmlText cannot be used to encode complex types.]
Сгенерированный код
[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;
}
}





Вы можете использовать DateTimeOffset вместо чистого объекта DateTime.
Приятно знать, что это в 2.0 sp1 ... Все еще вызывает ошибку с автоматически созданным xsd.exe
Об этом говорили 2 дня назад. Это делает это для вас?
Я надеялся на автоматическое создание с помощью xsd.edu, но, возможно, исправление - это обходной путь
Не сериализуйте DateTimeOffset напрямую, а вместо этого сериализуйте строку:
// 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 */ }
}
Вы когда-нибудь находили решение?