ソケットを使用してプロセス間通信を行うアプリケーションを作成しました。クライアントが作成したサーバーに接続し、シリアル化されたメッセージを送信すると、手順が開始されます。このメッセージは、SerializeWithLengthPrefix を使用して Protobuf-net を使用してシリアル化し、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 上の別のサーバーからデータを要求することによってサービスを提供します。クライアントからサーバーへのこのメッセージ転送は問題なく行われます。
私のサーバーは Web サーバーからデータを受信すると、データをシリアル化し、データをクライアントに送信します。しかし今回、同じ手順を使用してクライアント側でデータをデシリアライズしようとすると、次の例外が発生します:「BaseMessage のパラメーターなしのコンストラクターが見つかりません」
次のコード行を使用して逆シリアル化します (ここで例外が発生します)。
BaseMessage baseMessage = Serializer.DeserializeWithLengthPrefix<BaseMessage>(networkStream, PrefixStyle.Base128);
そして、これがサーバー上でメッセージがシリアライズされた方法です。
Serializer.SerializeWithLengthPrefix(networkStream, baseMessage, PrefixStyle.Base128);
クライアントとサーバー間の接続の開始時に使用される NetworkStream はオブジェクトに格納され、そのオブジェクトはディクショナリに格納されます。ディクショナリ内のそのオブジェクトから同じ NetworkStream を選択し、それを使用して (サーバーから) シリアル化されたデータをクライアントに送信します。しかし、上記の問題が発生します。何か助けはありますか?
前もって感謝します...