【问题标题】:.net remoting: Update already serialized objects.net 远程处理:更新已序列化的对象
【发布时间】:2011-05-06 03:37:36
【问题描述】:

我有一个名为“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 对象

【问题讨论】:

  • 我猜这与您正在使用的mode 或激活有关。这里有很多信息codeproject.com/KB/WCF/net_remoting.aspx
  • 感谢您的链接。我没有得到很多关于我的具体情况的信息。本教程中没有返回具有更改值的相同对象的示例。该对象(在第 7 节中)是在调用 .func1() 方法时创建的。顺便说一句,我使用的是单例激活模式,因为我需要不断更新 IPoint 对象的值。
  • 一个可能的解决方案是让IPoint 也从MarshalByRefObject 继承(并且不可序列化)。单调用/单例设置也可以产生影响。
  • 我故意将 DefaultPoint 从 MarshalByRefObject 更改为提高我的应用程序的性能。它确实做得非常好,但代价是下一个问题

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


【解决方案1】:

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

【讨论】:

  • 听起来很有趣。服务器或客户端会调用 SynchronizePoints() 方法吗? “从对象中删除状态”是什么意思?
  • @yas4891,现在你有一个可变的 DefaultPoint,它是可变的、编组的 DefaultMeasurement 的一部分。这会导致您观察到的问题,因为您要么编组它们以反映可变性(这很慢),要么您不同步并需要一些解决方法来手动更新。如果您改为使用不可变值并具有根据需要显式请求状态的机制,则可以合并数据更新,这会更有效,并且您的设计也可以获得更好的隔离,因为观察到的值不能被消费者改变这些值。
  • @yas4891,换句话说,您可以将测量的可变性隔离到服务器,并拥有一个单独的数据传输对象,在客户端需要时发送测量的快照,而不是暴露原始可变数据。
  • 好的。我想我知道你在哪里。但是,我仍然不知道如何到达那里。您是否建议将 DefaultPoint 切换回继承 MarshalByRefObject,然后使用 DefaultPoint 作为索引器的返回值创建一个新的(可序列化的)TransportPoint 对象?
  • @yas4891,我怀疑您必须进行一些重新架构才能为客户端创建只读数据视图,同时将数据以您需要的任何形式保存在服务器上。如果没有更多关于您的整体设计和当前实施的背景信息,很难知道如何最好地完成此任务。这是整体设计的轻微变化可以完全消除技术问题的情况之一。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多