1

私は 3 つのプロジェクトを持っています。1 つ目はクライアント、2 つ目はサーバー、最後の 1 つが BroadcastMessage です。

クライアントには、シリアル化してオブジェクトを作成する次のコードがあります (this = BroadcastMessage):

public MemoryStream SerializeObject()
{
     MemoryStream stream = new MemoryStream();

     BinaryFormatter formatter = new BinaryFormatter();

     formatter.Serialize(stream, this);

     return stream;
}

次に、このストリームを byte[] に変換し、ソケット経由でサーバーに送信します。そこで、次のように逆シリアル化します。

BinaryFormatter formatter = new BinaryFormatter();
Stream str = new MemoryStream(inMessage);
BroadcastMessage m = (BroadcastMessage) formatter.Deserialize(str);

クライアントとサーバー間の通信は正しく、完全なストリームを受け取りますが、逆シリアル化しようとすると、単に動作せず、TargetInvocationException が発生します。原因は、オブジェクト (BroadcastMessage) がシリアル化されたプロジェクトを見つけようとすることです。このプロジェクトをサーバーに追加すると、逆シリアル化は問題なく機能しますが、この「BroadcastMessage」を使用するすべてのクラスのプロジェクトを追加することはできません。

助言がありますか?シリアル化するときに正しい名前空間を示す方法はありますか? 前もって感謝します!

編集:わかりました、私はクラスのイベントにサブスクライブしていたため、イベントのリスニングを取得し、完全に機能していたため、問題が発生しました。ありがとうございます。

4

1 に答える 1

1

プロジェクト全体を参照する必要はありません。特定のタイプのアセンブリで十分です。したがって、(逆) シリアル化する必要があるすべての型を独自のアセンブリに配置し、両方のプロジェクトからこれを参照する必要があります。

とにかくこれらのタイプを定義する必要があり、プロジェクトに同じコードを 2 回配置する必要がなくなります (DRY 原則)。

于 2013-07-12T07:54:55.393 に答える