我有以下课程:
Public Class ClassA
Private mMyVar As List( Of ClassB )
<DataMember (Name:="key")> _
Public Property MyVar As List( Of ClassB)
Get
Return mMyVar
End Get
Set(value As List( Of ClassB))
mMyVar = value
RaisePropertyChanged( "MyVar" )
End Set
End Property
...
和
Public Class ClassB
Private mMyVar As List( Of IClassC )
<DataMember (Name:="key2")> _
Public Property MyVar As List( Of IClassC)
Get
Return mMyVar
End Get
Set(value As List( Of IClassC))
mMyVar = value
RaisePropertyChanged( "MyVar" )
End Set
End Property
...
最后,IClassC可以是几个可能的实际类之一。
我收到以下WCF错误:
mscorlib.dll中出现'System.ServiceModel.CommunicationException'类型的第一次机会异常
其他信息:尝试序列化参数baseEntity时出错.TurteException消息是'Type'ClassC2',数据协定名称为...不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关详细信息,请参阅InnerException。
我可以通过向ClassA添加以下装饰来轻松解决此问题:
<DataContract(Name:= "..." , Namespace:=...), KnownType (GetType (ClassC1)), KnownType (GetType (ClassC2))>
(如果我添加IClassC
则没有区别。)
这修复了ClassC1,但对于classC2,我得到错误:
mscorlib.dll中出现'System.InvalidOperationException'类型的第一次机会异常
附加信息:类型'ClassC2'无法添加到已知类型列表中,因为已存在具有相同数据协定名称“...”的其他类型“ClassC1”。如果存在特定类型的不同集合(例如,List和Test []),则不能将它们都添加为已知类型。请考虑仅指定其中一种类型以添加到已知类型列表中。
该消息暗示只能添加一个接口的已知类型。有没有解决方法,或者我需要以XML或其他方式传递集合吗?