protobuf-netを使用してメッセージを受け取ります。メッセージには、その中に格納されているメッセージのタイプ(フィールドは列挙型)の1つのフィールドがあります。今、私はメッセージが基底型から継承した型であることを知っています。私はシリアライザから取得したオブジェクトを適切な型にキャストするにはどうすればよいですか?子孫型へのキャスト
クラスの定義:どのように私はこれに似アイデアで何かを行うことができます
[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しないでください。子猫のことを考えてください。*本当です。 –
私は理由を理解できませんが、問題を説明したようには見えません。私はもっと簡単なメッセージを送ろうとしました。私が 'Akcja temp =(Akcja)ann;を実行すると、_Unhandled例外が発生します。System.InvalidCastException:ソースタイプから宛先タイプにキャストできません。代わりにAkcjaを受け取ろうとすると、同じことが起こります。 –
@lord - それを 'Akcja'としてシリアライズしましたか? (これは 'Update'と同じですか?)助けて嬉しいですが、私が正しいことに答えていることを確かめる必要があります... –