我有一个返回<DataContract> Public Class Character
的服务。该类具有属性<DataMember> Public Property Modifiers As ModernList(Of Modifier)
。修饰符也是一个DataContract:这里的问题是ModernList。 ModernList(Of T)是我对List的实现,有一些修改;它派生自System.Collections.Generic.List(Of T)。现在,我知道在WCF中返回派生类时,我们应该使用<KnownType>
来装饰基类,但是,我不能用它来装饰List(Of T)。另外,我无法使用<DataContract>
装饰我的ModernList(Of T),并使用<DataMember>
装饰其Item属性,因为在List(Of T)中Item不可覆盖。那么,我该怎么办?
编辑:我记得我可以改为创建一个Item属性来隐藏原始属性并用<DataMember>
装饰它,但后来我发现了这个:
'DKMainService.Infraestrutura.Jogo.Equipamento'类型中的属性'Item'无法序列化,因为不支持序列化索引属性。
编辑2:有趣的是,我可以完美地创建一个返回ModernList(Of T)的方法,并且它可以很好地工作。问题是返回类包含类型为ModernList(Of T)的属性。
答案 0 :(得分:0)
好吧,WCF一直欺骗我。 WCF告诉我“服务器没有提供有意义的回复;这可能是由合同不匹配,过早的会话关闭或内部服务器错误引起的。”现在,那没有告诉我什么。我一直以为问题出在我的ModernList上,因为如果列表为null,那么一切都会正常工作。今天,因为这个原因,我的大脑被绞了几个小时,不知何故,由于某种原因,WCF决定改变它的错误信息,为我提供了一个更清晰的方法,让我知道问题的确切位置:它在一个属性中一个类,它是ModernList(Of Modifier)中一个Modifiers的属性类型!请参阅:枚举Enum Knowledges
没有为其分配值0
的成员(第一个成员的值为1
)。然后,有一个类具有Knowledges
类型的属性。反过来,该属性未在构造中初始化,也不可为空。现在您可能已经意识到这里的问题:枚举是一种值类型,因此无法使用Null
进行分配;他们的默认值是0
。我的Enum没有一个值为0
的成员,所以当它被反序列化时,它试图找到一个值为0
的成员,因为它不能为null,并且不存在。