【问题标题】:Using a different type for a collection when serializing with WCF使用 WCF 序列化时为集合使用不同的类型
【发布时间】:2009-11-25 12:50:14
【问题描述】:

想象一下,我有一个在 OO 模型中有意义的数据对象,但对于序列化,我希望将其引用其他类型的字段替换为简单的 ID,或者在某些情况下,替换为带有文本和身份证。

是否可以让序列化程序以不同方式处理特定字段,还是我必须从头开始使用简化字段重新定义第二个数据对象类并使用它?

例子:

Person
  Guid Id
  string Name
  List<Person> Siblings

我要序列化的内容:

Person
  Guid Id
  string Name
  List<Guid> Siblings

我希望只有一个类 Person,并为我的服务定义序列化行为(最好不在数据类型级别,因为它可以被序列化为 XML 或 JSON)。

我知道 WCF 中对引用的支持,但在这种情况下,我将引用结果集中其他地方未包含的其他类型;我只想包含他们的 ID。

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    您可以从序列化中excludeSiblings 属性并添加只读SiblingGuids

    Person
      Guid Id
      string Name
      [NonSerialized]
      List<Person> Siblings
      List<Guid> SiblingGuids // Only a getter which will expose guids
    

    【讨论】:

    • 我会使用这个解决方案,即使它并不理想(通常我不想让属性返回需要创建对象的值 - 在这种情况下是 List - 当检索)。
    【解决方案2】:

    一旦您更改了正在传输的信息的结构,数据传输对象可能是最简洁和最简单的选择。

    事实上,我总是建议为 WCF 服务创建专用的 DTO,以将服务及其传输的数据与我通常处理的域模型分开。单独管理模型和服务的更改会产生开销,但与必须将域对象强制为服务的正确形状然后尝试将它们保留在那里相比,它的工作量要少得多。

    【讨论】:

    • 我明白了。我不想强迫我的域对象符合我的 WCF 服务,但我希望它们完全不受与服务相关的任何东西的影响。我想要的是一种“继承”域对象结构的方法,仅以不同方式处理一些特定情况(引用列表),这样我就不会得到太多开销。
    • 我认为我对这个问题的理解还不够。你能做些什么来澄清你的问题吗?
    • 嗯...我想做我想做的事情的唯一方法是让序列化程序为集合中的每个项目调用一个回调。回调将返回一个仅包含我想要的值的对象,该对象被序列化并放入序列化集合中。所以基本上,对于Siblings 集合,序列化程序将为每个Person 实例调用回调,而回调将返回Guid 值。这样我就不需要额外的类,并且我得到了我想要的序列化结构。 WCF 可以做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多