ProtoBuf不会使用接口反序列化对象

时间:2019-07-29 13:01:47

标签: c# sockets protobuf-net

我有一个TCP套接字,我想使用ProtoBuf发送和接收对象。但是我遇到了这个错误:

  

抛出异常:protobuf-net.dll中的'System.InvalidOperationException'

     

类型不正确,无法推断出任何合同:Server.Packet.IMsg

我的界面:

"Reply/Handler"

我要发送和接收的对象之一:

 public interface IMsg { }

我的套接字在获取完整的缓冲区后尝试反序列化:

[ProtoContract]
public class PacketPerson : IMsg
{
    [ProtoMember(1)]
    public string Name{ get; set; }
    [ProtoMember(2)]
    public string Country { get; set; }
}

反序列化:

 IMsg msg = Serialization.Desirialize(SocketMemoryStream);

1 个答案:

答案 0 :(得分:1)

  

是,但是我想发送多对象并通过使用“ Type type = packet.GetType();”来识别它们然后使用If语句“ if(type == typeof(PacketPerson))”

我的建议(以作者的身份):


[ProtoContract]
[ProtoInclude(1, typeof(PacketPerson))]
// future additional message types go here
class SomeMessageBase {}

[ProtoContract]
class PacketPerson : SomeMessageBase
{
    [ProtoMember(1)]
    public string Name{ get; set; }
    [ProtoMember(2)]
    public string Country { get; set; }
}

并反序列化/序列化<SomeMessageBase>。该库将在此处以正确的方式处理所有继承。在幕后,这将类似于(.proto)来实现:

message SomeMessageBase {
    oneof ActualType {
        PacketPerson = 1;
        // ...
    }
}
message PacketPerson {
    string Name = 1;
    string Country = 2;
}

您现在可以在运行时使用多态或类型测试来确定实际类型。新的switch语法特别有用:

SomeMessageBase obj = WhateverDeserialize();
switch(obj)
{
    case PacketPerson pp:
        // do something person-specific with pp
        break;
    case ...:
        // etc
        break;
}