【问题标题】:Can't serialize nested nHibernate entity for WCF web service无法序列化 WCF Web 服务的嵌套 nHibernate 实体
【发布时间】:2012-05-08 06:00:08
【问题描述】:

我正在尝试同时使用 nHibernate、Spring 和 WCF。我有一个Order 对象,其中包含一个Customer 对象。

我可以在我的服务上调用 WCF 方法findOrder,并且提供OrderCustomer 字段没有DataMember 注释,Web 服务返回我想要的Order。正如预期的那样,它不包含Customer 详细信息。

但是当我尝试同时包含Customer 时,WebService 失败,并查看 WCF 跟踪日志,我可以看到此错误:

System.Runtime.Serialization.SerializationException: 使用数据合约名称键入“DecoratorAopProxy_95d4cb390f7a48b28eb6d7404306a23d” 'DecoratorAopProxy_95d4cb390f7a48b28eb6d7404306a23d:http://schemas.datacontract.org/2004/07/' 预计不会。考虑使用 DataContractResolver 或添加任何静态未知的类型 已知类型的列表 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到 传递给 DataContractSerializer 的已知类型列表

很确定这是因为客户包含额外的 nHibernate 详细信息,但我不明白为什么 WCF 会乐意发送 Order,而不是 Customer

谁能帮我理解一下?

订单对象

[DataContract]
[KnownType(typeof(Customer))]

public class Order
{
  // Standard properties
  [DataMember]
  public virtual int Id { get; set; }

  public virtual Enums.OrderStatus Status { get; set; }        

  [DataMember]
  [StringLength(20, ErrorMessage = "Order name must not be more than 20 characters long")]
  public virtual string Name { get; set; }

  [DataMember]
  public virtual Customer Customer { get; set; }

  [DataContract]
  ...
}

客户对象

public class Customer
{
    public virtual int CustomerId { get; set; }

    [DataMember]
    private string name = "";
    ...
}

【问题讨论】:

    标签: wcf nhibernate spring.net


    【解决方案1】:

    您应该使用数据传输对象 (DTO) 通过网络获取数据。无论如何,这是一种很好的做法,因为您不想让您的域模型泄漏到(或流出)应用程序的边界。

    想想你的领域模型的每一次变化都会导致你的数据契约发生变化,从而产生一个新的wsdl,从而导致客户端发生变化。此外,您告诉服务的消费者对您的应用程序的太多见解。

    尽管有这些建筑等等。 NHibernate 使用代理来启用延迟加载,这些代理是序列化程序所期望的另一种类型。您可以为您的域禁用延迟加载以使应用程序正常工作。恕我直言,这是个坏主意。

    <class name="Customer" table="tzCustomer" lazy="false" >
    

    【讨论】:

    • 感谢 Andreas,我感觉使用 DTO 将是前进的方向。这是我们必须拆分为使用 Spring/Hibernate 的 Web 服务层的第一个应用程序,所以我之前没有遇到过这个问题。不过,您的回答很有道理。
    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多