1

udpソケットなどを学習しようとしています。サーバーとクライアントの2つのプログラムを作成しました。クライアントはパケットをサーバーに送信し、サーバーはそれをバウンスします。

これは、データをbyte[]との間で変換するために両方のプログラムで使用するコードです。

しかし、byte[]から変換するときにエラーが発生します

public static Packet Open(byte[] b)
        {
            MemoryStream memStream = new MemoryStream();
            BinaryFormatter binForm = new BinaryFormatter();
            memStream.Write(b, 0, b.Length);
            memStream.Seek(0, SeekOrigin.Begin);
            object obj = new object();
            try
            {
                // this line here is where the error is occurring
                obj = (object)binForm.Deserialize(memStream);
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message);
            }
            if (obj is Packet)
                return (Packet)obj;
            else
                return null;
        }

        public byte[] Bundle()
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, this);
            return ms.ToArray();
        }

これを行うと、すべて1つのプログラムから機能します

Packet p =new Packet();
p.Message="hello";

byte[] data = p.Bundle();

Packet p2 = Packet.Open(data);
MessageBox.Show(p2.Message);

私が受け取っているエラーは、「「クライアントプログラムの名前」でアセンブリが見つかりません」です。

何か案は?

4

1 に答える 1

2

両端間の参照を介して共有されていないタイプをシリアル化しているように思えます。注:BinaryFormatterにはアセンブリを含む完全な型名が含まれているため、同じクラスを両方にコンパイルするだけでは不十分です。したがって、無関係な型としてカウントされます。そこでの一般的な修正(そして私は「修正」という言葉を完全に間違って使用しています)は、DTOのアセンブリを作成し、クライアントとサーバーの両方からそのアセンブリを参照することです。ただし、このアプローチにはまだ多くの問題があります。

参考までに、両端に同様のクラスがあるだけで互換性のある他のシリアライザーがあります。私は偏見がありますが、protobuf-netを見てみることをお勧めします。通常、出力は大幅に小さく、型に関連付けられていません。つまり、クラスは両端でほぼ類似している必要があります(バージョン耐性が非常に高い)。さらに、それは(CPUに関しても)より高速です!

于 2012-07-12T14:28:56.957 に答える