2

我有一个枚举:

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,
}

不幸的是,这不好。以下代码在两端的工作方式不同。

int componentId = 123;
int flag = ComponentDao.GetFlagForComponentById(componentId);

ComponentType componentType = ((ComponentType)flag);
//componentType == ComponentType.None (client end of service)
//componentType == ComponentType.Equipment (server end of service)

我环顾了一些属性装饰器,认为我可能会发现一些有用的东西:http: //msdn.microsoft.com/en-us/library/system.xml.serialization.xmlenumattribute.aspx。此链接显示如何更改序列化名称,但没有说明任何有关该值的内容。

这是否意味着我无法使用此序列化引擎维护我的枚举值?

4

3 回答 3

1

这不是序列化程序本身的问题,而是代码生成的问题。生成的代码与您的代码不一致。这可能是代码生成器中的错误,也可能是您的代码在生成代码后被修改。

在第二种情况下,您应该能够通过更新服务引用(或以其他方式重新生成代码)来解决问题。

如果您使用的是 Data Contract Serializer,您可能应该阅读以下内容:http: //msdn.microsoft.com/en-us/library/aa347875.aspx。也许用属性装饰你的枚举会让代码生成器正常工作。

于 2012-11-29T21:02:34.810 回答
0

我最终只是添加了对包含枚举的 DLL 的直接引用,并完全避免了序列化。抱歉,这不是一个很好的答案,但我无法完成这项工作。

于 2012-12-05T06:47:05.267 回答
0

我的解决方案:

  • 为每个项目添加一个 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();
        }
    }
    

希望这可以帮助

于 2013-02-15T01:13:21.597 回答