1

可能是这个问题的副本

我正在尝试DataSerializer使用与wcf.

对象结构:

[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;}
}

人员属性:资源定义属性

  • PersonnelClassProperty

人员类:资源类

  • PersonnelClassProperty

人员类属性:资源类属性

上面的结构是使用映射的Nhibernate。所以基类abstract classes具有我们覆盖到主类中的基本属性。我们正在使用它,所以我们可以使用一个通用类来调用Nhibernate.

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

我们还循环遍历属性和关联的类属性来获取它们,因为它们正在被延迟加载nHibernate

这使我能够生成一些测试数据。我们现在有一个personnelclass带有personnelclassproperty. 这些都可以自行检索。接下来我们有一个person. 我们添加了对personnelclass和的引用personnelclassproperty。在数据库中,我们有一个额外的表,其中包含 person 和 之间链接的引用personnelclass,因为这是一个many-to-many relationShip. thepersonProperty引用了 single personnelClassproperty,所以 aFK在这里就足够了。

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

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

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

发生的情况是,我们通过 wcf 将 person 对象发送给接收方,如果personProperty和之间没有链接,这可以正常工作personnelClassProperty,但是如果我们添加personproperty带有 的链接的PersonnelClassProperty,我们会得到上面提到的异常。

我在网上看到的所有例子和问题都以同样的方式工作

如此具体;我究竟做错了什么?或者我在这里忘记了什么?

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

编辑:我更新了Person对象的结构以显示我对KnownTypes. 请注意,这也包含personnelClassProperty类型,我也为PersonProperty对象执行了此操作,因为那是包含PersonnelClassProperty对象的实际类,但personPropertiesPerson. 这也不起作用。

4

1 回答 1

1

我找到了解决方案。因为我们在使用NHibernate,所以我们lazy loading进入personnelClassPropertyPersonproperty并最终进入了Person。这导致serialization exception.

实际上有2个解决方案可以解决异常:

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

2:您可以Lazyload()启用该属性,而是从对象中获取一个项目并在尝试序列化之前对其进行处理。像这样创建一个新变量是不够的:

PersonnelClassProperty classproperty = personProperty.PersonnelClassProperty;

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

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

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

于 2013-04-11T12:36:22.703 回答