[ C# ] クラスオブジェクトをネットワークで共有する ( Serializable )

Pocket

VB.NET や C# では、オブジェクトのシリアル化を行いその内容をファイルなどに出力したり、出力したファイルの内容を読み込んでデシリアライズ化して元のクラスオブジェクトを復元させることが出来ます。

スポンサーリンク

ここでは、シリアル化するストリームに NetworkStream を使用して、オブジェクトをネットワークで共有出来るようにしています。サンプルコードでは通信プロトコルには TCP / IP を使用しています。以下、手順に従ってサンプルコードを掲載していきます。

シリアル化するオブジェクトを DLL で作成する

プロセス間でオブジェクトのシリアライズ・デシリアイズを行うには、それぞれのアプリケーションがオブジェクト(クラス)の定義を知っている必要があります。ここでは DLL に共有するオブジェクトの定義を行い、それぞれのアプリケーションが参照するようにします。

    [Serializable]
    public class SerialObject
    {
        // シリアライズされない
        // デシリアライズ時しても 100 は格納されない。(0 となる)
        [NonSerialized]
        public int    PublicData = 100;

        // シリアライズされる
        public string StrData { get ; set; }
        public int    NumData { get; set;}

        // 数値データを設定する
        public void setNumber(int m)
        {
            NumData    = m; // シリアライズ対象データ
            PublicData = m; // シリアライズ未対象データ
        }
    }
オブジェクトをシリアライズするクライアントアプリケーション

シリアライズする側(クライアント)のサンプルコードになります。

    // シリアライズするオブジェクトの初期化
    SerialObject sobj = new SerialObject();
    sobj.NumData = 999;
    sobj.StrData = "送信します";
    sobj.setNumber(12);  // シリアルオブジェクトの値を変更する

    // TCP接続
    TcpClient client = new TcpClient();
    client.Connect("localhost", 23444);

    NetworkStream strm = client.GetStream();
    IFormatter formatter = new BinaryFormatter();

    // シリアライズする。ストリームには NetworkStream
    formatter.Serialize(strm, sobj);
    strm.Close();

    // TCP切断
    client.Close();
オブジェクトをデシリアライズするサーバアプリケーション

デシリアライズする側(サーバ)のサンプルコードです。

    /*
     * クライアントからの接続を受け付ける IP アドレスとポート番号を設定
     */
    IPAddress ipaddr = IPAddress.Parse("127.0.0.1"); 
    TcpListener listener = new TcpListener(ipaddr, 23444);
            
    // 待ち受け開始
    listener.Start();

    // クライアントからの接続があるまで待機
    TcpClient tcp = listener.AcceptTcpClient();

    NetworkStream stream = tcp.GetStream();
    IFormatter formatter = new BinaryFormatter();

    // 受信したデータをデシリアライズ
    SerialObject obj = (SerialObject)formatter.Deserialize(stream);
    stream.Close();

    // クライアントとの TCP/IP 接続を閉じる
    tcp.Close();

    // クライアントからの接続受け付けを終了
    listener.Stop();

    // シリアライズ対象データの確認
    MessageBox.Show("NumData = " + obj.NumData.ToString()); // NumData = 12
    MessageBox.Show("StrData = " + obj.StrData);            // StrData = 送信します

    // シリアライズ未対象(初期設定値も反映されない)
    MessageBox.Show("NonSerialData = " + obj.PublicData.ToString()); // NonSerialData = 0 
参考
スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>