【问题标题】:WCF ignore data contract not workingWCF 忽略数据合同不起作用
【发布时间】:2012-04-23 13:54:32
【问题描述】:

我有一个托管在 IIS 上的 WCF 服务。这是我的界面:

[ServiceContract]
[SilverlightFaultBehavior]
public interface IETC
{
   [OperationContract]
   [PrincipalPermission(SecurityAction.Demand, Role = "XYZ")]
   string GetStampXML();

   [OperationContract]
   [PrincipalPermission(SecurityAction.Demand, Role = "XYZ")]
   List<Stamp> GetStamps();
}

当我通过 Web 浏览器访问 WCF 服务时出现错误。错误如下:

Type 'System.Windows.Media.ImageSource' cannot be serialized. Consider marking it with the DataContractAttribute attribute.....

我的邮票类别是:

[DataContract]
public class Stamp
{
    private string _Name;
    private string _SmallIcon = "";
    private string _MediumIcon = "";
    private string _LargeIcon = "";

    private BitmapImage _SmallImage;
    private BitmapImage _MediumImage;
    private BitmapImage _LargeImage;

    [DataMember]
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    [DataMember]
    public string SmallIcon
    {
        get { return _SmallIcon; }
        set { _SmallIcon = value; }
    }

    [DataMember]
    public string MediumIcon
    {
        get { return _MediumIcon; }
        set { _MediumIcon = value; }
    }

    [DataMember]
    public string LargeIcon
    {
        get { return _LargeIcon; }
        set { _LargeIcon = value; }
    }

    [IgnoreDataMember]
    public BitmapImage SmallImage
    {
        get { return _SmallImage; }
        set { _SmallImage = value; }
    }

    [IgnoreDataMember]
    public BitmapImage MediumImage
    {
        get { return _MediumImage; }
        set { _MediumImage = value; }
    }

    [IgnoreDataMember]
    public BitmapImage LargeImage
    {
        get { return _LargeImage; }
        set { _LargeImage = value; }
    }
}

这就像 IgnoreDataMember 没有被识别。我在没有 IgnoreDataMember 图形的情况下尝试了它,它只会序列化 DataMembers,但这也不起作用。任何想法为什么它似乎试图序列化 BitmapImage?

【问题讨论】:

  • 您不应该需要 IgnoreDataMember 属性,当您在对象上指定 DataContract 时,只会在类上设置具有 DataMember 属性的属性。您应该检查您的服务接口,也许您使用的是 XmlSerializer 而不是 DataContract 序列化程序。
  • 我试过没有明确添加 IgnoreDataMember 也没有运气。我怎么知道我正在使用 XmlSerializer?我认为 DataContract 属性会使其使用 DataCotnract 序列化程序。
  • 我刚刚意识到您的错误消息说“考虑用 DataContractAttribute 标记它”,它应该来自 DataContract 序列化程序。所以这可能没问题。您发布的代码看起来也不错,因此错误可能在您的服务接口中使用的其他对象之一的其他地方。您应该知道,默认情况下,未使用 DataContract 标记的对象将序列化所有公共属性。您可以先尝试在 WCF 之外序列化测试对象。见msdn.microsoft.com/en-us/library/ms752244.aspx

标签: c# .net wcf serialization


【解决方案1】:

您运行的是哪个版本的 .net? .NET 4 数据协定不要求您显式设置 Ignore 属性。您可以通过使用 DataContractSerializer 并将内容写入文件来测试正在生成的内容。创建控制台应用程序并引用您的服务项目。

namespace SO_10281928
{
    class Program
    {
        static void Main(string[] args)
        {
            var instance = new Stamp
                               {
                                   Name = "Test",
                                   SmallIcon = "Small Icon",
                                   LargeIcon = "LargeIcon",
                                   MediumIcon = "MediumIcon"
                               };

            using (var stream = new FileStream(@"c:\temp\stamp.xml", FileMode.Create))
            {
                var ds = new DataContractSerializer(typeof (Stamp));
                ds.WriteObject(stream, instance);
            }

            Console.WriteLine("Done.");
            Console.ReadLine();
        }
    }

    [DataContract]
    public class Stamp
    {
        private string _Name;
        private string _SmallIcon = "";
        private string _MediumIcon = "";
        private string _LargeIcon = "";

        private BitmapImage _SmallImage;
        private BitmapImage _MediumImage;
        private BitmapImage _LargeImage;

        [DataMember]
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        [DataMember]
        public string SmallIcon
        {
            get { return _SmallIcon; }
            set { _SmallIcon = value; }
        }

        [DataMember]
        public string MediumIcon
        {
            get { return _MediumIcon; }
            set { _MediumIcon = value; }
        }

        [DataMember]
        public string LargeIcon
        {
            get { return _LargeIcon; }
            set { _LargeIcon = value; }
        }

        public BitmapImage SmallImage
        {
            get { return _SmallImage; }
            set { _SmallImage = value; }
        }

        public BitmapImage MediumImage
        {
            get { return _MediumImage; }
            set { _MediumImage = value; }
        }

        public BitmapImage LargeImage
        {
            get { return _LargeImage; }
            set { _LargeImage = value; }
        }
    }

    public class BitmapImage
    {
    }
}

结果是:

<Stamp xmlns="http://schemas.datacontract.org/2004/07/SO_10281928" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <LargeIcon>LargeIcon</LargeIcon>
    <MediumIcon>MediumIcon</MediumIcon>
    <Name>Test</Name>
    <SmallIcon>Small Icon</SmallIcon>
</Stamp>

【讨论】:

  • 这也是我所期望的。也许这与我在 Silverlight 库中的 Stamp 类以及我在 .NET 4 WCF 项目中使用它有关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2013-05-16
  • 1970-01-01
  • 2021-10-20
  • 2015-02-15
相关资源
最近更新 更多