我创建了一个应用程序,其中使用套接字完成进程间通信。当客户端连接到我创建的服务器并发送序列化消息时,该过程开始。这条消息,我使用 Protobuf-net 序列化,使用 SerializeWithLengthPrefix 并使用 DeserializeWithLengthPrefix 反序列化它。客户端将消息发送到完美反序列化它的服务器,但在服务器到客户端的情况下并非如此。
主类是BaseMessage,它是抽象的。
[Serializable, ProtoContract, ProtoInclude(5001, typeof(LogonMessage))]
abstract public class BaseMessage
{
public BaseMessage()
{
}
abstract public int MessageType { get; }
}
LogonMessage 实现了 BaseMessage 类。
[Serializable, ProtoContract]
public class LogonMessage : BaseMessage
{
public LogonMessage()
{
}
[ProtoMember(1)]
public string Broker { get; set; }
[ProtoMember(2)]
public int ClientType { get; set; }
public override int MessageType
{
get { return 1; }
}
}
在初始握手之后,客户端请求一些在 protobuf-net 帮助下序列化的服务,而我端的本地服务器通过从网络上的另一台服务器请求数据来提供服务。从客户端到服务器的消息传输完美无缺。
当我的服务器从 Web 服务器接收到数据时,它会将其序列化并将数据发送到客户端。但是这一次,当我尝试使用相同的过程在客户端反序列化数据时,我得到以下异常:“No parameterless Constructor found for BaseMessage”
我使用以下代码行反序列化(这是发生异常的地方)。
BaseMessage baseMessage = Serializer.DeserializeWithLengthPrefix<BaseMessage>(networkStream, PrefixStyle.Base128);
这就是消息在服务器上的序列化方式。
Serializer.SerializeWithLengthPrefix(networkStream, baseMessage, PrefixStyle.Base128);
在客户端和服务器之间的连接开始时使用的 NetworkStream 存储在一个对象中,该对象存储在一个字典中。我从字典中的该对象中挑选出相同的 NetworkStream 并使用它将序列化数据发送到客户端(从服务器)。但是会出现上述问题。有什么帮助吗?
提前致谢...