【问题标题】:WCF - Serialization Exception even after giving DataContract and DataMemberWCF - 即使在提供 DataContract 和 DataMember 之后也出现序列化异常
【发布时间】:2010-06-05 15:43:18
【问题描述】:

即使我指定了 Datacontract 和 Datamember,我仍然收到以下异常。你能帮我理解一下问题是什么吗?

“类型 'MyServiceLibrary.CompanyLogo' 无法序列化。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。”

注意:当我运行服务主机时发生异常。我什至没有创建客户端。

using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Runtime.Serialization;
using MyServiceLibrary;

namespace MySelfHostConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            System.ServiceModel.ServiceHost myHost = new ServiceHost(typeof(NameDecorator));
            myHost.Open(); 
            Console.ReadLine();
        }
    }

}

//The Service is 

using System.ServiceModel;
using System.Runtime.Serialization;

namespace MyServiceLibrary
{
    [ServiceContract(Namespace = "http://Lijo.Samples")]
    public interface IElementaryService
    {
        [OperationContract]
        CompanyLogo GetLogo();
    }

    public class NameDecorator : IElementaryService
    {
        public CompanyLogo GetLogo()
        {
            Shape cirlce = new Shape();
            CompanyLogo logo = new CompanyLogo(cirlce);
            return logo;
        }
    }

    [DataContract]
    public class Shape
    {
        public string SelfExplain()
        {
            return "sample";
        }

    }

    [DataContract]
    public class CompanyLogo
    {
        private Shape m_shapeOfLogo;

        [DataMember]
        public Shape ShapeOfLogo
        {
            get
            {
                return m_shapeOfLogo;
            }
            set
            {
                m_shapeOfLogo = value;
            }
        }

        public CompanyLogo(Shape shape)
        {
            m_shapeOfLogo = shape;
        }
        public CompanyLogo()
        {

        }
    } 

}

//主机配置是

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.serviceModel>
    <services>

      <service name="MyServiceLibrary.NameDecorator"
               behaviorConfiguration="WeatherServiceBehavior">

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8017/ServiceModelSamples/FreeServiceWorld"/>
          </baseAddresses>
        </host>

        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="MyServiceLibrary.IElementaryService" />
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WeatherServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

谢谢

李乔

【问题讨论】:

    标签: wcf


    【解决方案1】:

    你的CompanyLogo 类必须有一个默认的无参数构造函数,否则它不能被反序列化。

    编辑:创建了一个新项目,复制粘贴了您的代码,一切似乎都运行良好。确保您的服务库被正确引用,并且没有使用没有该属性的旧版本。

    【讨论】:

      【解决方案2】:

      似乎无法确认这些问题 - 在我的机器上就像一个魅力。我可以让服务主机启动并运行,没问题。我可以从 WCF 服务测试客户端连接到它,请求如下所示:

      <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Header>
          <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://Lijo.Samples/IElementaryService/GetLogo</Action>
        </s:Header>
        <s:Body>
          <GetLogo xmlns="http://Lijo.Samples" />
        </s:Body>
      </s:Envelope>
      

      响应是这样的:

      <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Header />
        <s:Body>
          <GetLogoResponse xmlns="http://Lijo.Samples">
            <GetLogoResult xmlns:a="http://schemas.datacontract.org/2004/07/SerializeLogo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
              <a:ShapeOfLogo>
                <a:ShapeName i:nil="true" />
              </a:ShapeOfLogo>
            </GetLogoResult>
          </GetLogoResponse>
        </s:Body>
      </s:Envelope>
      

      在我看来:这项服务有效(作用不大 - 但有效)。

      对所有参数进行双重和三重检查 - 一定有什么东西以某种方式关闭......

      【讨论】:

      • Serialization.dll 版本有问题。对困惑感到抱歉。感谢您的及时支持
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多