复杂类型的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
。我们添加了对personnelclass
和personnelclassproperty
的引用。在数据库中,我们有一个额外的表,用于保存人和personnelclass
之间的链接的引用,因为这是many-to-many relationShip
。personProperty
只引用了一个personnelClassproperty
,所以这里一个FK
就足够了。
这里,我们遇到了第二个问题,出现了序列化异常:
因此,从第一行提到的问题中,我继续将数据合同名称为'PersonnelClassPropertyProxy:http://schemas.datacontract.org/2004/07/'的'PersonnelClassPropertyProxy'是不需要的。考虑使用DataContractResolver或将任何未知静态类型添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
[DataContract]
, [DataMember]
和[KnownType(typeof(T))]
属性添加到上面提到的类中。其中T
当然是正确的类型。
发生的事情是,我们通过wcf将person对象发送到接收方,如果personProperty
和personnelClassProperty
之间没有链接,则工作正常,但如果我们添加一个链接到PersonnelClassProperty
的personproperty
,我们会得到上面提到的异常。
我在网上看到的所有例子和问题都是一样的
所以具体;我做错了什么?我还忘了什么?
我将尝试用更多的代码来更新这个问题,以说明我们使用的对象。
edit:我更新了Person
对象的结构,以显示我对KnownTypes
所做的事情。请注意,这也保留了personnelClassProperty
类型,我也为PersonProperty
对象这样做了,因为这是保存PersonnelClassProperty
对象的实际类,但是Person
中使用了personProperties
列表。
我找到了解决办法。因为我们用的是NHibernate
,我们把lazy loading
从personnelClassProperty
变成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()
选项