可能是这个问题的副本
我正在尝试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
. 这也不起作用。