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
相关产品推荐
相关产品推荐

