我使用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;
答案 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无关)。