可能是这个问题的副本
我正在尝试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对象的实际类,但personProperties在Person. 这也不起作用。