转换为后代类型

时间:2011-06-17 17:54:18

标签: c# protobuf-net

我使用protobuf-net收到消息。该消息有1个字段,其中存储了消息的类型(该字段是枚举类型)。现在我知道消息属于从基类型继承的类型。如何将我从Serializer获得的对象转换为适合的类型?

课程定义:

[ProtoContract]
class Annoucement
    {
        public enum msgType
        {
            AKCJA = 0,
            CZEKAJ = 1,
            GOTOWY = 2,
            NOWY_GRACZ = 3,
            LISTA_GRACZY = 4,
            ERROR = 5,
            MAPA = 6,
            UPDATE = 7,
            LISTAGIER = 8,
            JOINGAME = 9,
            QUIT = 10
        }
        [ProtoMember(1)]
        public msgType typ;
    }

[ProtoContract, ProtoInclude(14, typeof(Annoucement))]
    class Update : Annoucement
    {
        [ProtoMember(1)]
        public List<Tank> czolg;
        [ProtoMember(2)]
        public List<Pocisk> pocisk;
        [ProtoMember(3, IsRequired = false)]
        public List<Bonus> bonus;
    }

我怎样才能做出与此类似的想法:

Annoucement ann = Serializer.DeserializeWithLengthPrefix<Annoucement> (str, PrefixStyle.Base128);
switch (ann.typ) {
case Annoucement.msgType.UPDATE:

                {
                    Update temp = (Update)ann;
                    Console.WriteLine (temp.czolg.Count);
                    List<Tank>.Enumerator i = temp.czolg.GetEnumerator ();
                    Console.WriteLine (i.Current.life);
                }


                break;

1 个答案:

答案 0 :(得分:1)

它应该正常工作;我认为问题是属性被颠倒了(在这种情况下我会注意提出更明确的错误) - 它应该是:

[ProtoContract, ProtoInclude(14, typeof(Update))]
class Annoucement
{

}

[ProtoContract]
class Update : Announcement
{

}

即。基地需要了解后代。我没有从序列化中删除鉴别器,因为如果它直接与对象类型 相关,那就是多余的 - 它通过ProtoInclude在内部处理它并将创建正确的类型。每种类型都需要知道关于直接子类型的 ,即

A
- B
 - C
- D
 - E
 - F

这里需要了解B和D; B需要了解C; D需要了解E和F.

请注意,“这是什么”枚举在这里是一个好主意,但不需要它是一个字段 - 没有字段的虚拟属性可能更合适。如果我有误导并且消息类型与对象类型相关,那么请忽略我; p

另外:公共领域 - 不要这样做。想想小猫......它会工作,但属性是首选(一般来说,我的意思是;与protobuf-net无关)。