views:

27

answers:

1

I have a WCF Service.
It returns the below type. I get the data in the first level but not any of the data in the nested lists... What could be my problem?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace slCF2.Web
{
    public class Customer
    {
        string _firstname;
        string _lastname;              
        List<BO> _bos;
        List<AO> _aos;



        public string FirstName
        {
            get { return _firstname; }
            set { _firstname = value; }
        }

        public string LastName
        {
            get { return _lastname; }
            set { _lastname = value; }
        }

        public System.Collections.Generic.List<AvailableOption> AvailableOptions
        {
            get { return _availableoptions; }
            set { _availableoptions = value; }
        }

        public System.Collections.Generic.List<BuiltOption> BuiltOptions
        {
            get { return _builtoptions; }
            set { _builtoptions = value; }
        }

    }
    [Serializable]
    public class AO
    {
        string _code;

        public string Code
        {
            get { return _code; }
            set { _code = value; }
        }

    }
    [Serializable]
    public class BO
    {
        string _code;

        public string Code
        {
            get { return _code; }
            set { _code = value; }
        }

    }
}
A: 

I would put [DataContract] attributes on the classes and [DataMember] on all the properties you want to include in the WCF messages.

[DataContract]
public class Customer
{
    string _firstname;
    string _lastname;              
    List<BO> _bos;
    List<AO> _aos;

    [DataMember]
    public string FirstName
    {
        get { return _firstname; }
        set { _firstname = value; }
    }

    [DataMember]
    public string LastName
    {
        get { return _lastname; }
        set { _lastname = value; }
    }

    [DataMember]
    public System.Collections.Generic.List<AvailableOption> AvailableOptions
    {
        get { return _availableoptions; }
        set { _availableoptions = value; }
    }

    [DataMember]
    public System.Collections.Generic.List<BuiltOption> BuiltOptions
    {
        get { return _builtoptions; }
        set { _builtoptions = value; }
    }
}

[DataContract]
public class AO
{
    string _code;

    [DataMember]
    public string Code
    {
        get { return _code; }
        set { _code = value; }
    }
}

[DataContract]
public class BO
{
    string _code;

    [DataMember]
    public string Code
    {
        get { return _code; }
        set { _code = value; }
    }
}

With WCF in .NET 3.5 SP1 this is no longer a must-have criteria, but just to be clear and explicit in my intent, I would still put those on anyway. You need to decorate all classes and their properties with those - even nested and descendant classes etc.

Also, the [Serializable] attribute you use doesn't really have anything to do with WCF message serialization. WCF uses either the data contract serializer (by default) using the [DataContract] / [DataMember] attributes, or the XmlSerializer (optional; works without the [Serializable] attribute, too).

marc_s