.net remoting:更新已经序列化的对象

时间:2011-05-06 03:37:37

标签: c# .net client .net-remoting

我有一个名为“DefaultMeasurement”的MarshalByRefObject,它包含一个IPoint对象列表。

public class DefaultMeasurement : MarshalByRefObject, IMeasurement
{
  private List<IPoint> iPoints;
  public this[int aIndex]
  {
    get { return iPoints[aIndex];}
  }
}

[Serializable]
public class DefaultPoint : IPoint, ISerializable
{
  public int Value {get;set;}
}

首次从服务器检索DefaultMeasurement对象时,所有点都被序列化,并且在所有后续调用DefaultMeasurement.Points期间,我得到了启动客户端时正确的列表。但与此同时,该列表中至少有一个对象的状态可能已更改,并且我没有获得当前状态,尽管在服务器中状态得到更新。 如何强制更新该列表?

进一步澄清:
- 一旦我DefaultPoint : MarshalByRefObject,它就会起作用,但这不是一种选择,因为它会对性能产生负面影响 - “更新”是指对服务器上现有对象的更改,不在列表本身上添加/删除 - 我最多可能有80k DefaultPoint个对象

2 个答案:

答案 0 :(得分:3)

由于你不希望Point本身成为MarshalByRef(因为如果你有大量的点,它会引入很多流量),我建议你有明确的方法来同步点值。在服务器上进行了大量更改后,可以调用SynchronizePoints()方法,该方法包括所有点的新值。现在,客户端代理具有更新状态。更好的是,首先从对象中删除状态(因为它实际上不是服务器状态的直接反映),而是使用从服务器收集点时根据需要实例化的客户端对象。

答案 1 :(得分:0)

您必须在服务器上实施a callback that notifies the client更改。

通知可以传递已更改的对象的ID,或者客户端可以请求更改的对象列表。