C# 使用XML序列化程序序列化枚举--保留名称,但丢失值。有什么办法把两者都保留下来吗?
我有一个枚举:C# 使用XML序列化程序序列化枚举--保留名称,但丢失值。有什么办法把两者都保留下来吗?,c#,xml,serialization,enums,C#,Xml,Serialization,Enums,我有一个枚举: public enum ComponentType { None = -1, Equipment = 0, Cable = 2, Port = 4, Space = 8, Site = 9, Building = 10, Floor = 11, DataCenter = 12, Area = 13, Rack = 14, Conduit = 16, Person = 17,
public enum ComponentType
{
None = -1,
Equipment = 0,
Cable = 2,
Port = 4,
Space = 8,
Site = 9,
Building = 10,
Floor = 11,
DataCenter = 12,
Area = 13,
Rack = 14,
Conduit = 16,
Person = 17,
Pit = 18
}
我想在WCF服务的另一端使用此枚举。因此,我需要序列化它
我看到序列化程序生成以下内容:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.website.com/api")]
public enum ComponentType {
/// <remarks/>
None,
/// <remarks/>
Equipment,
/// <remarks/>
Cable,
/// <remarks/>
Port,
/// <remarks/>
Space,
/// <remarks/>
Site,
/// <remarks/>
Building,
/// <remarks/>
Floor,
/// <remarks/>
DataCenter,
/// <remarks/>
Area,
/// <remarks/>
Rack,
/// <remarks/>
Conduit,
/// <remarks/>
Person,
/// <remarks/>
Pit,
}
我查看了一些属性装饰器,认为可能会找到一些有用的东西:。此链接显示如何更改序列化名称,但不说明有关该值的任何内容
这是否意味着我无法使用此序列化引擎维护枚举值?这不是序列化程序本身的问题,而是代码生成的问题。生成的代码与您的代码不一致。这可能是代码生成器中的错误,也可能是在生成代码后修改了代码 在第二种情况下,您应该能够通过更新服务引用(或以其他方式重新生成代码)来修复问题
如果您正在使用数据协定序列化程序,您可能应该阅读以下内容:。也许用属性装饰枚举可以让代码生成器正常工作。我最后只是添加了对包含枚举的DLL的直接引用,完全避免了序列化。很抱歉,这不是一个很好的答案,但我无法完成此操作。我的解决方案:
- 向每个项添加XmlEnumAttribute
- 使用反射获取属性值并将其解析为int
public enum myEnum { [System.Xml.Serialization.XmlEnumAttribute("1")] titi, [System.Xml.Serialization.XmlEnumAttribute("2")] toto } public static class myEnumExtensions { public static int toInt(this myEnum value) { MemberInfo memberInfo = typeof(myEnum). GetMember(value.ToString()).FirstOrDefault(); XmlEnumAttribute attribute = (XmlEnumAttribute) memberInfo. GetCustomAttributes(typeof(XmlEnumAttribute), false).FirstOrDefault(); return int.Parse(attribute.Name); } } class test { static void Main(string[] args) { int i = myEnum.titi.toInt(); } }
希望这有帮助为什么您要将0强制转换为ComponentType而不是使用ComponentType.None(或ComponentType.Equipment)?@zimdanen这就是一个例子。我们的数据库中存储了一个整数值。从数据库检索时,我希望将整数值转换为相应的枚举值。但是,由于序列化问题,整数值对应于不同的枚举值。您没有数据的查找表(MS SQL)或枚举类型(mySQL)是有原因的吗?我已经更新了一次服务引用,但我将删除它并从头重新生成,以查看这是否解决了问题。编辑:删除和重新生成无效。也许这是代码生成器的问题,但我怀疑这只是序列化实现的限制。我们拭目以待。@SeanAnderson我刚才添加到答案中的链接有什么帮助吗?有点。我没有使用数据协定序列化程序,如代码所示。如果我使用DCS,CodeDom编译器将从“System.Xml”更改为“System.ServiceModel”。这还有其他我正在努力避免的有趣的副作用。我怀疑DCS是一个更为先进的序列化程序,但唉,技术债务。我看看能不能找到别的办法!
public enum myEnum
{
[System.Xml.Serialization.XmlEnumAttribute("1")]
titi,
[System.Xml.Serialization.XmlEnumAttribute("2")]
toto
}
public static class myEnumExtensions
{
public static int toInt(this myEnum value)
{
MemberInfo memberInfo = typeof(myEnum).
GetMember(value.ToString()).FirstOrDefault();
XmlEnumAttribute attribute = (XmlEnumAttribute) memberInfo.
GetCustomAttributes(typeof(XmlEnumAttribute), false).FirstOrDefault();
return int.Parse(attribute.Name);
}
}
class test
{
static void Main(string[] args)
{
int i = myEnum.titi.toInt();
}
}