首页 文章

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

提问于
浏览
2

尝试传递包含接口和接口/类列表的基本类型的“复杂”类类型 .

我猜这个有问题的成员是:

public List<IMyInterface> IntrfList

运行时错误:

接收到http:/localhost/xxxxxx/xxxxxService.svc的HTTP响应时发生错误 . 这可能是由于服务 endpoints 绑定不使用HTTP协议 . 这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭) . 请参阅服务器日志以获取更多详

MS服务跟踪查看器(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)

1 回答

  • 5

    好吧,明白了!

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

    在战斗并削减了“共享”课程的所有可能部分之后,我找到了问题所在 .

    问题是我使用interface作为成员(或列表......),它与Driven类相关联 .

    就是这样!序列化程序在确定如何序列化该成员时遇到问题,所以这是解决方案:

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

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

    每种类型都必须标记为:

    [System.Runtime.Serialization.DataContract]
    

    注意:由于JobBase是抽象的,没有理由用KnownType标记它...

    而已 .

相关问题