Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XML序列化程序序列化枚举--保留名称,但丢失值。有什么办法把两者都保留下来吗?_C#_Xml_Serialization_Enums - Fatal编程技术网

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();
    }
}