c# - 自定义日期时间 XML 序列化

标签 c# web-services .net-2.0 xml-serialization asmx

我希望能够使用既不是服务器时间也不是客户端时间的特定时区来序列化 DateTime。基本上,任何时区。 是否可以在 .Net2.0 网络服务中覆盖 DateTime 序列化?

我使用 xsd.exe 编译了一个 xmlschema,所以我尝试使用 XmlSchemaImporter。

OnSerialize 示例显示值更改,但不更改输出格式。

XmlSchemaImporter,将其加载到 gac 中,运行 xsd.exe,并生成具有我想要的类的代码...但是该类是一个属性,最终无法反射(reflect)出来。

[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;
    }
}

XmlSchema 导入器

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,而是序列化一个字符串:

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

关于c# - 自定义日期时间 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/306579/

相关文章:

C# > 输入 =""时将字符串转换为 double

android - Android 消息中的表情符号

c# - .Net 2.0 winforms 客户端应用程序可以连接到 Windows Server .Net 3.5 WCF 服务吗? - 需要架构建议

.net - .net(或其任何部分)是开源的吗?

c# - 从 .NET 2.0 向下迁移到 .NET 1.1 - DllImport 不再有效

c# - 构造函数可以抛出代码的通用重试逻辑

c# - 使用 Dapper QueryMultiple 时在泛型参数中提供类型

c# - 序列化为 JSON(使用 Json.Net),同时忽略继承的成员

c# - 如何处理一些异步的 TcpClient 响应?

c# - 调试 C# ASP.NET Web 服务