尝试传递包含接口和接口/类列表的基本类型的“复杂”类类型。
我猜这个有问题的成员是:
public List<IMyInterface> IntrfList
运行时错误:
接收到http:/localhost/xxxxxx/xxxxxService.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
MS Service Trace Viewer(SvcTraceViewer)中的描述性错误:
类型'myType'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记。有关其他受支持的类型,请参阅Microsoft .NET Framework文档。
我按照解释的建议做了但没有帮助。
“共享”类:
[System.Runtime.Serialization.DataContract]
public class ServerState
{
private Queue<IJob> _mWaitingQueue;
public Queue<IJob> mWaitingQueue
{
get
{
lock (_LockObjWaiting)
{
return _mWaitingQueue;
}
}
private set
{
_mWaitingQueue = value;
}
}
private object _LockObjWaiting = new object();
private List<IJob> _mInPrograssList = new List<IJob>();
[DataMember]
public List<IJob> mInPrograssList
{
get
{
return _mInPrograssList;
}
private set
{
_mInPrograssList = value;
}
}
}
IJob是一个界面。 IJob的结构是这样的:
IJob (Interface)
- JobBase (Abstract class)
- JobA (Driven from JobBase)
- JobB (Driven from JobBase)
答案 0 :(得分:5)
好吧,明白了!
我在我的博客中发布了解决方案:http://livshitz.wordpress.com/2012/11/06/wcf-serialization-datacontract-runtime-error-type-mytype-cannot-be-serialized/
在战斗并削减“共享”课程的所有可能部分之后,我找到了问题所在。
问题是我使用了接口作为成员(或列表......),它与Driven类相关联。
就是这样!序列化程序在确定如何序列化该成员时遇到问题,所以这是解决方案:
当将接口用作要通过WCF序列化和共享的类中的成员(或接口列表)时, Shared 类必须指定可能的通过添加接口的类型:
[System.Runtime.Serialization.KnownType(typeof(JobA))]
[System.Runtime.Serialization.KnownType(typeof(JobB))]
每种类型都必须标有:
[System.Runtime.Serialization.DataContract]
注意:由于JobBase是抽象的,因此没有理由用KnownType标记它......
就是这样。