无法序列化的WCF Web服务嵌套NHibernate的实体(Can't serialize

2019-10-16 15:46发布

我试图使用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

谁能帮我明白了吗?

Order对象

[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 = "";
    ...
}

Answer 1:

您应该使用数据传输对象(DTO)通过电线,让您的数据。 这是很好的做法反正你不想让你的域模型漏入(进出)应用程序的边界。

想想这样的事情在你的数据契约的改变在你的领域模型结果的每一个变化,从而产生新wsdl ,从而在客户端上的变化。 另外你告诉你的服务你aplication太多见解的消费者。

尽管所有这些建筑的喇嘛喇嘛。 NHibernate的使用代理来实现延迟加载,这些代理比你序列化程序要求另一种类型。 您可以为您的域获得了应用工作禁用延迟加载。 这是恕我直言,一个坏主意。

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


文章来源: Can't serialize nested nHibernate entity for WCF web service