【问题标题】:Serializing Object Tree for WCF transfer in Silverlight using IsReference=true使用 IsReference=true 在 Silverlight 中为 WCF 传输序列化对象树
【发布时间】:2010-12-17 18:28:02
【问题描述】:

我正在使用 Silverlight 4、.NET 4.0。

我有一个在共享库中定义的对象(在我的 Silverlight 项目和托管 WCF 服务的 Web 项目之间共享)

对象是一个树结构,它有一个子节点列表,以及对其父节点和根节点的引用。

即。

class TreeNode
{
  public List<TreeNode> Children {get; set;}
  public TreeNode Root { get; set; }
  public TreeNode Parent { get; set; }
}

问题是当 Silverlight 尝试获取此对象并将其发送到服务器时,我收到有关循环引用的异常。经过一番研究,我发现我必须像这样将属性 IsReference 启用为 true:

[DataContract(IsReference = true)]
class TreeNode
{
  public List<TreeNode> Children {get; set;}
  public TreeNode Root { get; set; }
  public TreeNode Parent { get; set; }
}

问题是当我这样做时,我的 WCF 服务不再工作,因为它无法为此加载所需的程序集:

“无法加载文件或程序集'System.Runtime.Serialization, Version=2.0.5.0”

这是因为包含 TreeNode 类的项目是针对 Silverlight 运行时而非 .NET 运行时构建的,并且使用 System.Runtime.Serialization v2.0.5.0,而 Web 项目和 WCF 服务使用 v4.0.30319。

所以,我的问题是:有没有一种方法可以让这个对象序列化,同时保留引用,而无需将整个对象结构移动到一个针对标准 .NET 4.0 运行时构建的不同项目?

另外,值得注意的是,我尝试过使用条件编译,例如:

#if SILVERLIGHT
[DataContract(IsReference = true)]
#endif

但这不起作用,因为 WCF 服务需要知道它必须保留引用...

非常感谢您对此提供的任何帮助。

【问题讨论】:

    标签: silverlight wcf serialization datacontract


    【解决方案1】:

    我在这个场景中使用了三个选项:

    1. 代理
    2. 不共享程序集,而是共享代码。
    3. 从完整的 .NET 代码中引用 SL 的 System.Runtime.Serialization 并将本地复制设置为 true(并且可以选择使用 ILMerge 构建后步骤来合并 System.Runtime.Serialization 程序集并将其内部化以防止其他程序集使用它)。

    2 是最直接的。使用 IsReference = true 保留 DataContract。创建另一个以 .NET 为目标的项目(另一个以 SL 为目标)。在 .NET 项目中,将您的文件添加为链接文件。这样,当它编译时,SL 将使用 System.Runtime.Serialization dll 用于 SL,而 .NET 项目将使用 System.Runtime.Serialization dll 用于 .NET。

    1 和 3 允许您继续共享实际的 DLL。

    选项 1 的工作原理如下:删除 DataContract 属性。在通过网络进行序列化之前,动态创建与您想要序列化的类匹配的代理类型(但添加带有 IsReference = true 的 DataContract 属性)。您可以使用 Reflection.Emit(或 Windsor 等其他一些动态类型生成器)创建这些类。然后使用 AutoMapper 之类的东西将您的数据复制到代理类型中。序列化/反序列化代理类型。

    选项 3 的工作方式如下:让您的代码与现在一样(使用 DataContract 和 IsReference = true)。将 System.Runtime.Serialization 设置为 Copy Local。可以选择使用 /internalize 选项添加 ILMerge 构建后任务,以将 System.Runtime.Serialization dll 合并到您自己的中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多