复杂类型的wcf序列化问题

本文关键字:序列化 问题 wcf 类型 复杂 | 更新日期: 2023-09-27 18:08:50

可能是这个问题的重复

我正在尝试使用与wcf一起使用的标准DataSerializer序列化一组对象。

对象结构:

[KnownType(typeof(PersonnelClassProperty))]
[KnownType(typeof(ResourceClassProperty))]
[KnownType(typeof(Person))]
[KnownType(typeof(PersonProperty))]
[KnownType(typeof(ResourceDefinitionProperty))]
[DataContract]
public class Person: ResourceDefinition
{
   [DataMember]
   public guid id {get; set;}
   [DataMember]
   public IList<PersonProperty> personProperties {get; set;}
   [DataMember]
   public IList<PersonnelClass> personnelClasses {get; set;}
}

PersonProperty: ResourceDefinitionProperty

  • PersonnelClassProperty

PersonnelClass: resourcecclass

  • PersonnelClassProperty

personnelclasspproperty: ResourceClassProperty

以上结构用Nhibernate进行映射。所以基本类是abstract classes与基本属性,我们覆盖到主类。我们使用这个,所以我们可以使用一个泛型类来调用Nhibernate中的CRUD函数。

这带来的第一个问题是循环引用,我们修复了这个问题。通过重新设置对象列表,我们消除了循环引用问题。

我们还通过循环属性和相关的类属性来获取它们,因为它们是通过nHibernate

惰性加载的。

这允许我生成一些测试数据。我们现在有一个personnelclass和一个personnelclassproperty。它们自己就能很好地恢复。下一个是person。我们添加了对personnelclasspersonnelclassproperty的引用。在数据库中,我们有一个额外的表,用于保存人和personnelclass之间的链接的引用,因为这是many-to-many relationShippersonProperty只引用了一个personnelClassproperty,所以这里一个FK就足够了。

这里,我们遇到了第二个问题,出现了序列化异常:

数据合同名称为'PersonnelClassPropertyProxy:http://schemas.datacontract.org/2004/07/'的'PersonnelClassPropertyProxy'是不需要的。考虑使用DataContractResolver或将任何未知静态类型添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

因此,从第一行提到的问题中,我继续将[DataContract], [DataMember][KnownType(typeof(T))]属性添加到上面提到的类中。其中T当然是正确的类型。

发生的事情是,我们通过wcf将person对象发送到接收方,如果personPropertypersonnelClassProperty之间没有链接,则工作正常,但如果我们添加一个链接到PersonnelClassPropertypersonproperty,我们会得到上面提到的异常。

我在网上看到的所有例子和问题都是一样的

所以具体;我做错了什么?我还忘了什么?

我将尝试用更多的代码来更新这个问题,以说明我们使用的对象。

edit:我更新了Person对象的结构,以显示我对KnownTypes所做的事情。请注意,这也保留了personnelClassProperty类型,我也为PersonProperty对象这样做了,因为这是保存PersonnelClassProperty对象的实际类,但是Person中使用了personProperties列表。

复杂类型的wcf序列化问题

我找到了解决办法。因为我们用的是NHibernate,我们把lazy loadingpersonnelClassProperty变成Personproperty,最后变成Person。这就产生了serialization exception .

实际上有两种解决方法来解决异常:

1:你可以在对象映射到NHibernate时设置Not.LazyLoad()属性而不是LazyLoad()属性

2:你可以让Lazyload()属性启用,而不是从对象中获取一个项目,并在你尝试序列化它之前对它做一些事情。这样创建一个新变量是不够的:

PersonnelClassProperty classproperty = personProperty.PersonnelClassProperty;

你真的需要对内部对象做一些事情,就像这样:

PersonnelClassProperty classProperty = personProperty.PersonnelClassProperty;
System.Diagnostics.Debug.WriteLine(classproperty.Dbid);

我们目前选择使用.Not.Lazyload()选项