サーバーでもクライアント時間でもない特定のタイムゾーンで DateTime をシリアライズできるようにしたいと考えています。基本的に、どの時間帯でも構いません。.Net2.0 Web サービスで DateTime シリアライゼーションをオーバーライドすることは可能ですか?
xsd.exeでxmlschemaをコンパイルするので、XmlSchemaImporterを使ってみました。
OnSerialize の例は、値の変更を示していますが、出力形式の変更は示していません。
XmlSchemaImporter を gac にロードし、xsd.exe を実行し、必要なクラスを持つコードを生成しました...しかし、そのクラスは属性であり、反映できません。
[InvalidOperationException: タイプ Cuahsi.XmlOverrides.W3CDateTime のメンバー 'metadataDateTime' をシリアル化できません。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;
}
}