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

これはシリアライザー自体の問題ではなく、コード生成の問題です。生成されたコードがあなたのコードと一致しません。これは、コード ジェネレーターのバグであるか、コードが生成された後にコードが変更された可能性があります。

2 番目のケースでは、サービス参照を更新する (またはコードを再生成する) ことで問題を解決できるはずです。

データ コントラクト シリアライザーを使用している場合は、おそらくこれを読む必要があります: 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 に答える