4

バイナリシリアル化オブジェクトを使用してデータストリームの読み取りまたは書き込みを行います。以前は、それらを書き込み/読み取りする場合は、「インスタンスクラス」をコンパイルしてDLLファイルにする必要があるため、それらの間に同じアセンブリがあります。

さて、ここに私の問題があります:

これは私のバイナリ送信者コードです

public void SendBinarySerial(object graph)
{
    IFormatter formatter = new BinaryFormatter();

    System.Net.Sockets.NetworkStream strm = mClient.GetStream(); //get TCPclient stream

    formatter.Serialize(strm, graph);
}

これが私のバイナリレシーバーコードです:

private void doRead()
{
    do 
     {
       if (mClient.GetStream().CanRead) 
          {
             System.Net.Sockets.NetworkStream strm = mClient.GetStream();

              IFormatter formatter = new BinaryFormatter();

              object mydat = (object)formatter.Deserialize(strm);//deserialize data receiver         
           }
    } while (true);
}

そして、これは私がクライアント全体に送信したい私の「インスタンスクラス」コードです。ok次のコードを考えてみましょう。

[Serializable()]
public class DataSend
{
    public List<Bitmap> MainData = new List<Bitmap>();
    public List<string> Title = new List<string>();
}

ご覧のとおり、ビットマップや文字列など、いくつかのリスト変数があります。ビットマップデータは画像データ用です。多くの画像で埋めると、可変メモリのサイズが大きくなり、おそらく約20mbになります。

その後、私はそれらをクライアント全体に送信しようとしています。さて、ここに私の質問があります:

この手法を使用すると、サイズオブジェクトが約20 mbの場合、これはうまく機能しますか?SocketCommunicationにはデータ送信のサイズ制限があることを知っています

プロトコルをまったく定義したくありません。ソケット通信を使用したいだけですが、これは最善の方法ではないかもしれません。

御返答いただき有難うございます。

4

2 に答える 2

2

ソケットを使用したサイズ制限については心配しません。私の経験から、NetworkStreamとの間で任意のサイズの読み取り/書き込みが可能です。ただし、ビットマップオブジェクトの直列化可能性については心配です。私の知る限り、これは画像データをシリアル化しません。

于 2012-12-30T06:45:00.837 に答える
0

ファイルサイズが数MBを超えると、BinaryFormatterは実際に苦労し始めます。より高度なシリアル化技術を使用するオープンソース通信ライブラリの使用を検討しましたか?

networkcomms.netを使用すると、sendメソッドは次のようになります(RAWオブジェクトを指定するだけで、すべてのシリアル化が行われます)。

NetworkComms.SendObject("DataPacket", ipAddress, port, object);

受信側では、コードは次のようになります。

NetworkComms.AppendGlobalIncomingPacketHandler<object>("DataPacket", (header, connection, incomingObject) => { object mydat = incomingObject; });
TCPConnection.StartListening();
于 2013-01-20T13:23:46.540 に答える