C# .net远程处理:更新已序列化的对象

C# .net远程处理:更新已序列化的对象,c#,.net,client,.net-remoting,C#,.net,Client,.net Remoting,我得到了一个名为“DefaultMeasurement”的MarshallByRefObject,其中包含一个IPoint对象列表 public class DefaultMeasurement : MarshalByRefObject, IMeasurement { private List<IPoint> iPoints; public this[int aIndex] { get { return iPoints[aIndex];} } } [Seri

我得到了一个名为“DefaultMeasurement”的MarshallByRefObject,其中包含一个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:MarshallByRefObject,IMeasurement
{
私人上市ipoint;
公开此[国际索引]
{
获取{return iPoints[aIndex];}
}
}
[可序列化]
公共类DefaultPoint:IPoint,ISerializable
{
公共int值{get;set;}
}
当第一次从服务器检索DefaultMeasurement对象时,所有的点都会被序列化,并且在随后调用DefaultMeasurement.points时,我会在启动客户端时得到正确的列表。但在此期间,该列表中至少一个对象的状态可能已更改,我无法获取该当前状态,尽管在服务器中该状态已更新。 如何强制更新该列表

进一步澄清:
-一旦我执行了
DefaultPoint:MarshallByRefObject
,它就会工作,但这不是一个选项,因为它会对性能产生负面影响
-“更新”指的是对服务器上现有对象的更改,不在列表本身上添加/删除

-我可能有多达80k的
DefaultPoint
对象

您必须在服务器上实现一系列更改


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

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

我想这与您使用的
模式或激活有关。这里有很多信息,谢谢你的链接。我没有从中得到很多关于我的具体场景的信息。在本教程中,没有关于返回具有更改值的相同对象的示例。对象(在第7节中)是在调用.func1()方法时创建的。顺便说一句,我使用的是单例激活模式,因为我需要不断更新IPoint对象的值。一个可能的解决方案是使
IPoint
也从
MarshallByRefObject
继承(并且不可序列化)。单次调用/单次设置也可能会有所不同。我故意将DefaultPoint从MarshallByRefObject更改为远离MarshallByRefObject,以提高应用程序的性能。它确实做到了这一点,但代价是下一个听起来很有趣的问题。SynchronizePoints()方法是由服务器调用还是由客户端调用?“从对象中删除状态”是什么意思?@yas4891,现在您有一个可变的DefaultPoint,它是可变的、编组的DefaultMeasurement的一部分。这会导致出现您观察到的问题,因为您要么将它们都封送以反映可变性(这很慢),要么失去同步,需要一些变通方法来手动更新。如果您改为使用不可变的值,并且有一种机制根据需要显式请求状态,那么您可以整合数据更新,这会更高效,而且在设计中也会得到更好的隔离,因为观察到的值不能被这些值的使用者变异。@yas4891,换句话说,您可以将度量的可变性隔离到服务器,并拥有一个单独的数据传输对象,该对象在客户端需要时通过度量的快照发送,而不是公开原始的可变性数据。确定。我想我知道你在干什么。然而,我仍然不知道如何到达那里。您是否建议将DefaultPoint切换回inherit MarshallByRefObject,然后使用
DefaultPoint
作为索引器的返回值来创建一个新的(可序列化的)
TransportPoint
对象?@yas4891,我怀疑您必须进行一些重新设计,以便为客户端创建数据的只读视图,同时在服务器上以您需要的任何形式保存数据。如果没有更多关于总体设计和当前实现的上下文,很难知道如何最好地实现这一点。在这种情况下,总体设计的轻微变化可以完全消除技术问题。