0

したがって、次のコードを使用して、ネットワークストリームを介して「Packet」クラスを送信しようとしています。

IFormatter formatter = new BinaryFormatter();
NetworkStream stream = client.GetStream();
formatter.Serialize(stream, packet);


stream.Flush();
stream.Close();
client.Close();

このクラスの使用:

[Serializable]
public class Packet
{

    public string header;
    public string content;
    public int size = 0;

    public Packet(string header, string content)
    {
        this.header = header;
        this.content = content;

        size = Encoding.ASCII.GetByteCount(header) + Encoding.ASCII.GetByteCount(content);
    }
}

しかし、反対側で読んでいると、次のエラーが発生します。

'System.Runtime.Serialization.SerializationException: Unable to find assembly 'Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.'

これは私の読書コードです:

NetworkStream ns = client.GetStream();
IFormatter formatter = new BinaryFormatter();
Packet p = (Packet)formatter.Deserialize(ns);
MessageBox.Show(p.header);
return p;

なぜこれが起こっているのか考えていますか?

編集:

サーバー側のパケットクラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Server
{

    public class Packet
    {
        public string header;
        public string content;
        public int size = 0;

        public Packet(string header, string content)
        {
            this.header = header;
            this.content = content;

            size = Encoding.ASCII.GetByteCount(header) + Encoding.ASCII.GetByteCount(content);
        }
    }
}
4

3 に答える 3

2

あるアセンブリからオブジェクトをバイナリシリアル化し、別のアセンブリのクラスに対して逆シリアル化することはできません。

クライアントとサーバーの両方から参照する 3 番目のアセンブリが必要です。

于 2013-02-06T05:51:53.180 に答える
1

BinaryFormatter から逆シリアル化する場合、クラスが使用可能である必要があります。これは、エラーが言っていることです。

Client.dll で Packet クラスが定義されていると想定しています。その場合は、「サーバー」プロジェクトの Client.dll への参照で、サーバーのパケット定義を削除します。

一般的な方法は、クライアントとサーバーで共有できる DataModel アセンブリを用意することです。

またXmlSerializer、 BinaryFormatter の代わりに を使用すると、クライアントとサーバーの両方でクラスの異なる実装を持つことができます。

于 2013-02-06T05:50:13.093 に答える
0

2つの別個の(機能的には同一の)パケットクラスを作成しました。クライアントは、名前と構造が同じであっても、シリアル化されたタイプとは異なるタイプを逆シリアル化できません。

クラスライブラリタイプの別の3番目のプロジェクト/アセンブリでPacketクラスを定義してみてください。その後、クライアントとサーバーの両方からそのプロジェクトまたはアセンブリを参照します。さらに正確に言うと、このクラスライブラリでインターフェイスIPacketを定義し、クライアントとサーバーの両方に実装するだけです。

お役に立てば幸いです。

于 2013-02-06T05:56:15.583 に答える