0

.NETリモーティングチャネルを介したプロパティの読み取りに問題があります。これが私のクラスの始まりです:

[Serializable]
public class MachineID
{
    private string mySystemDeviceSerial = null;
    /// <summary>
    /// Returns the hard drive serial that Windows is installed on.
    /// </summary>
    public string SystemDeviceSerial
    {
        get { return mySystemDeviceSerial; }
    }

    private string mySystemName = null;
    /// <summary>
    /// Returns the current name of the system.
    /// </summary>
    public string SystemName
    {
        get { return mySystemName; }
    }

    private string myLastError = string.Empty;
    /// <summary>
    /// Returns the last error that occurred. Returns string.Empty if no error has occurred.
    /// </summary>
    public string LastError
    {
        get { return myLastError; }
    }

    private int myPort = -2;
    public int Port
    {
       get { return this.myPort; }
       set { this.myPort = value; }
    }

すべてのプロパティは、ローカルマシンで問題なくアクセスできます。ただし、.NETリモーティングチャネルを介してクライアントからPortプロパティを読み取ろうとすると、myPortに割り当てられている値ではなく、初期値の-2が取得されます。すべての文字列プロパティを正常に読み取ることができるため、私はこれに困惑しています。何か案は?このクラスを適切にシリアル化していないのですか?

このクラスとメンバーをシリアライズ可能にするために私が行ったのは、クラスの先頭に[Serializable]属性を追加することだけであることに注意してください。これがこれを行うための適切な方法であるかどうかはわかりません。おそらくこれが問題の一部である可能性がありますか?

4

1 に答える 1

0

私の推測(そして私はそれが単なる推測であることを強調します)はあなたが間違った順序を持っているということです-あなたは

  1. リモーティングホストからアイテムを取得する
  2. (ホスト上で)更新してから
  3. クライアントの値がホストで変更した値に更新されることを期待します。

を使用する[Serializable]と、オブジェクトがバイトストリームに変換され、ネットワークを介してリモートクライアントに送信されてから、クライアント上の新しいオブジェクトに再構成されます。これは、クライアントのコピーがサーバーのコピーから完全に切断されていることを意味します。クライアントのコピーにサーバーからの更新された値を常に表示させたい場合(オブジェクト全体を再送信せずに)、@ Hans-Passantが提案するように、MarshalByRefObjectから継承させます。これにより、クライアントは、サーバーのプロパティの1つにアクセスするたびにサーバーにクエリを実行する透過プロキシをコピーします。

于 2012-08-30T00:59:36.727 に答える