1

可能的this questionWCF序列化问题具有复杂类型

我试图序列化一组使用标准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;} 
} 

PersonProperty:ResourceDefinitionProperty

  • PersonnelClassProperty

PersonnelClass:ResourceClass

  • Pers的插件
  • PersonnelClassProperty

PersonnelClassPoperty:ResourceClassProperty

上述结构使用Nhibernate映射。所以基类是abstract classes,它具有基本属性,我们将其覆盖到主类中。我们使用这个,所以我们可以使用一个通用的类来调用Nhibernate中的CRUD函数。

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

我们也遍历属性和关联的类属性来获取它们,因为它们是通过nHibernate

这让我产生一些测试数据被延迟加载。我们现在有一个personnelclasspersonnelclassproperty。这些都可以自行检索。接下来我们有一个person。我们添加了对personnelclasspersonnelclassproperty的引用。在数据库中,我们有一个额外的表格,该表格包含人与personnelclass之间的链接的参考,因为这是many-to-many relationShippersonProperty有一个参考单personnelClassproperty,所以在这里一个FK就足够了。

这里,我们碰上了第二个问题,发生了系列化例外:

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

所以从第一行继续讲到[DataContract][DataMember][KnownType(typeof(T))]属性添加到上面提到的类中提到的问题作出。 T当然是正确的类型。

发生的事情是,我们派人通过WCF到接收方,其工作微小物体,如果是personPropertypersonnelClassProperty之间没有联系,但如果我们用一个链接添加一个personpropertyPersonnelClassProperty,我们得到的异常上文提到的。

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

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

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

编辑:我更新了Person对象的结构来展示一下我与KnownTypes完成。请注意,这也包含personnelClassProperty类型,我也为PersonProperty对象执行了此操作,因为这是保留PersonnelClassProperty对象的实际类,但在Person中使用了personProperties列表。这也不起作用。

回答

1

我找到了解决方案。因为我们使用的是NHibernate,所以我们将lazy loadingpersonnelClassProperty转换成Personproperty并最终转换成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()选项