You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# XML序列化/反序列化同名枚举转换失败问题排查

问题描述

我有一个类库包含如下枚举:

public enum LibraryAuth
{
    Online,
    Offline,
}

该枚举被用于类库中的某个对象。

我自己定义了如下枚举:

[Serializable, XmlType]
public enum MyAuth
{
    [XmlEnum]
    Online,
    [XmlEnum]
    Offline,
}

此枚举用于我程序中的自定义类:

[Serializable, DebuggerStepThrough, DesignerCategory("code"), GeneratedCode("WebServiceProxyUpdater", "1.0.0.0"), XmlType]
public class MyClass
{
    [XmlAttribute]
    public MyAuth auth { get; set; }
}

类库对象与我的对象属性完全一致。

我尝试通过以下通用方法将类库对象转换为我的程序对象:

public static destT CreateCopy<sourceT, destT>(sourceT sourceObj)
{
    try
    {
        XmlSerializer sourceXS = new XmlSerializer(typeof(sourceT));
        XmlSerializer destXS = new XmlSerializer(typeof(destT));
        using (MemoryStream ms = new MemoryStream())
        {
            sourceXS.Serialize(ms, sourceObj);
            ms.Position = 0;
            return (destT)destXS.Deserialize(ms);
        }
    }
    catch (Exception ex)
    {
        return default(destT);
    }
}

但运行时抛出错误:Instance validation error: '' is not a valid value for MyAuth

若将MyAuth替换为类库的LibraryAuth,序列化可正常执行。请问我的枚举定义中缺少了什么配置?

编辑:我已阅读相关问题线程,但该提问者希望忽略错误,而我需要实现对象间的正常转换。


问题原因与解决方法

问题出在你给MyAuth枚举成员添加的[XmlEnum]特性上——你没有指定枚举成员对应的XML文本值。

当类库的LibraryAuth被序列化时,Online和Offline会被序列化为对应的字符串值(比如<MyClass auth="Online"/>)。但你的MyAuth枚举成员只加了[XmlEnum]却没传参数,这会导致XmlSerializer把这些成员序列化为空字符串,反过来在反序列化时,XmlSerializer拿到类库序列化出来的"Online"/"Offline"字符串,找不到MyAuth中对应匹配的枚举成员,就会抛出验证错误。

解决方法很简单,给[XmlEnum]特性显式指定与枚举成员名称一致的字符串值:

[Serializable, XmlType]
public enum MyAuth
{
    [XmlEnum("Online")]
    Online,
    [XmlEnum("Offline")]
    Offline,
}

这样配置后,XmlSerializer就能正确将类库序列化出来的"Online"/"Offline"字符串映射到MyAuth的对应枚举成员,转换就能正常执行了。

内容的提问来源于stack exchange,提问作者GoldNova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:50:44