Justin
Justin

Reputation: 6559

WCF ignore data contract not working

I have a WCF Service hosted on IIS. Here is my Interface:

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

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

I am getting an error when I go to my WCF service through the web browser. The error is as follows:

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

My stamps Class is:

[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; }
    }
}

It is like the IgnoreDataMember is not being recognized. I tried it without the IgnoreDataMember figure it was going to only serialize the DataMembers, and that didn't work either. Any ideas why it seems to trying to serialize the BitmapImage?

Upvotes: 1

Views: 3885

Answers (1)

Petar Vučetin
Petar Vučetin

Reputation: 3615

What version of .net are you running? .NET 4 Data Contract does not require you to explicitly set Ignore attributes. You can test what's being produced by using DataContractSerializer and writing the content to the file. Create console application and reference your service project.

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
    {
    }
}

And the result is :

<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>

Upvotes: 1

Related Questions