none
リモート通信でのオブジェクトの受け渡しについて RRS feed

  • 質問

  • リモート通信(TcpCannel)を使用してコンピュータ間の処理を実行しようとしています。

    リモート処理自体には問題がないのですが、メソッドを実行する場合に、パラメータに

    オブジェクトを指定したいのですがうまくいきません。

    シリアライズを指定すれば良いようなのですがよく分かりません。

    作成したクラスに指定してみたのですがうまくいきませんでした。

     

    [seriarize]

    class test

    {

    ...

    }

     

    test t = new test();

    cannel.Method(t);

     

    のようにリモートのメソッドに自分で作成したクラスを指定したいのです。

    このようなことは可能なのでしょうか?

     

    だれか詳しい方がいましたら教えてください。

     

    よろしくお願いします。

     

    2008年3月7日 2:29

回答

  • 外池と申します。まず、リモート通信そのものは、あるアプリケーションが公開しているオブジェクトを、他のアプリケーション(他のPCで走っていてもいいし、同じPCで走っていても良い)から利用する、というもので、これは、できているんですよね?

     

    以下、本題ですが、

     

    あるアプリケーションに存在しているオブジェクト(クラスのインスタンス)を、何らかの形で「梱包」して、他のアプリケーションに持っていって、そこで使うということ、この方法がよくわからない、というご質問だと思います。

     

    可能です。

    • リモート通信を媒介にして、オブジェクトを格納する変数を使って、他のアプリケーションに送ってもよし、
    • もっと低レベルな、ネットワークストリームを使って、他のアプリケーションに送るもよし、
    • リムーバブルな記録メディアにストリームとして記録して、オフラインで送って、他のアプリケーションに渡してもよし、
    • オブジェクトを用意したアプリケーション自身が、オブジェクトを一度保管してシャットダウンし、再起動後にオブジェクトを読み出すのもよし、

    すべて、仰るとおりの「シリアライズ」という概念で、オブジェクト(クラスのインスタンス)を「梱包」することになります。シリアライズ自体は、すこし調べればすぐに出来るようになりますが、

     

    ひとつ注意点を。

     

    渡す先の他のアプリケーションも、そのオブジェクトのクラスを知っていなければなりません。(あるいは、最低限、インターフェイスを知っていなければなりません。) ですので、双方のアプリで、共通のクラスのソースプログラムか、共通のインターフェイスのソースプログラムを用意して、コンパイルする必要があります。

    2008年3月7日 2:50
  • エラーの内容をもう少し詳しく具体的に書いた方がよいと思います。

     

    (例えばtestクラス内にシリアル化不可能なクラス等があればできません)

    2008年3月8日 2:45

すべての返信

  • 外池と申します。まず、リモート通信そのものは、あるアプリケーションが公開しているオブジェクトを、他のアプリケーション(他のPCで走っていてもいいし、同じPCで走っていても良い)から利用する、というもので、これは、できているんですよね?

     

    以下、本題ですが、

     

    あるアプリケーションに存在しているオブジェクト(クラスのインスタンス)を、何らかの形で「梱包」して、他のアプリケーションに持っていって、そこで使うということ、この方法がよくわからない、というご質問だと思います。

     

    可能です。

    • リモート通信を媒介にして、オブジェクトを格納する変数を使って、他のアプリケーションに送ってもよし、
    • もっと低レベルな、ネットワークストリームを使って、他のアプリケーションに送るもよし、
    • リムーバブルな記録メディアにストリームとして記録して、オフラインで送って、他のアプリケーションに渡してもよし、
    • オブジェクトを用意したアプリケーション自身が、オブジェクトを一度保管してシャットダウンし、再起動後にオブジェクトを読み出すのもよし、

    すべて、仰るとおりの「シリアライズ」という概念で、オブジェクト(クラスのインスタンス)を「梱包」することになります。シリアライズ自体は、すこし調べればすぐに出来るようになりますが、

     

    ひとつ注意点を。

     

    渡す先の他のアプリケーションも、そのオブジェクトのクラスを知っていなければなりません。(あるいは、最低限、インターフェイスを知っていなければなりません。) ですので、双方のアプリで、共通のクラスのソースプログラムか、共通のインターフェイスのソースプログラムを用意して、コンパイルする必要があります。

    2008年3月7日 2:50
  • エラーの内容をもう少し詳しく具体的に書いた方がよいと思います。

     

    (例えばtestクラス内にシリアル化不可能なクラス等があればできません)

    2008年3月8日 2:45
  • 自己レスですみません。

     

    外池様、indogo-x 様、回答ありがとうございました。

    クラスの中に構造体を幾つか定義していて、その中の1つに[serializable]

    を付けるのを忘れていました。

    全て確認したはずでしたが、見落としてしまいました。

    構造体も全て[serializable]すれば、問題なく動くようになりました。

     

    この件はこれで終了とします。

     

    2008年3月10日 1:38
  • こんにちは。中川俊輔 です。

     

    外池さん、indigo-xさん、回答ありがとうございます。

     

    としぼ@jfe-techさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、勝手ながら外池さん、indigo-xさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    としぼ@jfe-techさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月17日 2:09