【问题标题】:DataContract runtime error - Type 'myType' cannot be serialized. What i'm doing wrong?DataContract 运行时错误 - 无法序列化类型“myType”。我做错了什么?
【发布时间】:2012-11-06 06:55:22
【问题描述】:

试图传递“复杂”类类型,其中包含带有接口和接口/类列表的原始类型。

我猜有问题的成员是:

public List<IMyInterface> IntrfList

运行时错误:

接收对 http:/localhost/xxxxxx/xxxxxxService.svc 的 HTTP 响应时出错。这可能是由于服务端点绑定未使用 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)

【问题讨论】:

  • 你能粘贴你的类 myType 吗?它的数据注释可能有问题。
  • “myType” == ServerState 也是如此? IJob 实现也需要序列化。它们是可序列化的吗?
  • 另外,至少在这个示例中,您对锁的使用是有问题的。
  • 是的,“myType”是 ServerState。是的,不应该在 DataMember 类型属性中使用锁。

标签: c# wcf serialization exception-handling datacontract


【解决方案1】:

好的,知道了!

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

在与“共享”课程的所有可能部分进行斗争和削减之后,我找到了问题所在。

问题是我使用接口作为成员(或..列表),它与驱动类相关联。

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

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

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

并且每种类型都必须标有:

[System.Runtime.Serialization.DataContract]

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

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多