繁体   English   中英

DataContract运行时错误-类型'myType'无法序列化。 我做错了什么?

[英]DataContract runtime error - Type 'myType' cannot be serialized. What i'm doing wrong?

试图传递“复杂”类类型,该类类型包含具有接口的原始类型以及接口/类的列表。

我猜有问题的成员是:

public List<IMyInterface> IntrfList

运行时错误:

收到对http:/localhost/xxxxxx/xxxxxService.svc的HTTP响应时发生错误。 这可能是由于服务端点绑定未使用HTTP协议。 这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。 有关更多详细信息,请参见服务器日志。

来自MS Service跟踪查看器(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)

好吧,知道了!

我将解决方案发布在了我的博客中: http : //livshitz.wordpress.com/2012/11/06/wcf-serialization-datacontract-runtime-error-type-mytype-cannot-be-serialized/

在与“共享”班级的所有可能组成部分进行战斗和削减之后,我进入了有问题的领域。

问题是我将interface用作与Driven类相关联的成员(或..的列表)。

就是这样! 序列化器在弄清楚如何序列化该成员时遇到问题,因此这是解决方案:

当使用interface作为要通过WCF进行序列化和共享的类的成员(或接口列表)时, Shared类必须通过添加接口来指定接口的可能类型:

[System.Runtime.Serialization.KnownType(typeof(JobA))]
[System.Runtime.Serialization.KnownType(typeof(JobB))]

并且每种类型都必须标记为:

[System.Runtime.Serialization.DataContract]

注意:由于JobBase是抽象的,因此没有理由用KnownType对其进行标记...

而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM