none
Pasar un objeto personalizado a través de WCF 3.5 RRS feed

  • Pregunta

  • Estimados, tengo 2 proyectos, el primero con los DTO y el segundo con el servicio WCF.

    En el proyecto con los DTO se encuentran las siguientes clases:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using MaxFlow.Core.Enums;

    namespace MaxFlow.VO.OrgChart
    {
        [DataContract]
        [KnownType(typeof(RolNode))]
        public class RootRolNode : Node
        {
            /// <summary>
            /// Lista de nodos hijos.
            /// </summary>
            private List<Node> childNodes;

            /// <summary>
            /// Id del departamento al que pertenece.
            /// </summary>
            [DataMember]
            public String DepartmentId { get; set; }
           
            /// <summary>
            /// Retorna un listado de los nodos hijos.
            /// </summary>
            [DataMember]
            public List<Node> ChildNodes { get{ return this.childNodes;} }

            /// <summary>
            /// Se agrega un nodo hijo al nodo actual.
            /// </summary>
            /// <param name="node">Node que se agregará como hijo.</param>
            public void AddChildNode(Node node)
            {
                //Se instancia la lista de hijos al agregar el primer nodo.
                if (this.childNodes == null)
                    this.childNodes = new List<Node>();
               
                //Si el nodo no es de tipo RootRol se guarda el padre de este.
                switch(node.Type)
                {
                    case DepartmentNodeType.Rol:
                        ((RolNode)node).ParentNode = this;
                        break;
                    case DepartmentNodeType.Group:
                        ((GroupNode)node).ParentNode = this;
                        break;
                }

                //Se agrega el nodo a la lista de hijos.
                this.ChildNodes.Add(node);
            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;

    namespace MaxFlow.VO.OrgChart
    {   
        [DataContract]
        public class RolNode : RootRolNode
        {
            [DataMember]
            RootRolNode parentNode;
           
            [DataMember]
            public RootRolNode ParentNode
            {
                get { return parentNode; }
                set { this.parentNode = value; }
            }
        }
    }

    Al llamar al servicio paso el objeto RolNode como parámetro y aparece el siguiente error:

       en System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)

       en System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

       en System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)

    Al quitar la propiedad ParentNode o desmarcarla como DataMember de el objeto RolNode este funciona correctamente.

    ¿Existe alguna restricción o configuración especial al trabajar con herencia o con datos personalizados?

    Agredecería que me pudieran enviar alguna referencia o ejemplos con respecto a mi problema.

    Saludos Cordiales
    viernes, 12 de marzo de 2010 20:09

Todas las respuestas

  • Quizás sea que la clase Node no está siendo marcada para serializar, y si quitas el atributo parentNode como DataMember, no estás llamando al objeto RootRolNode, que es el que llama al objeto Node, el que no se reconoce como serializable y por lo tanto, funciona.
    sábado, 13 de marzo de 2010 17:28
  • Estimado, sorry por no haber adjuntado la clase faltante pero si la he marcado con los atributos correspondientes o al menos eso creo. Ademas la clase RolNode tambien debería tener el problema si es que el motivo fuera el que mencionas con anterioridad. Adjunto las clases faltantes y ojala que tu o alguien me pueda ayudar con este problema.

    Gracias de todos modos y Saludos

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using MaxFlow.Core.Enums;

    namespace MaxFlow.VO.OrgChart
    {
        [DataContract]
        [KnownType(typeof(GroupNode))]
        [KnownType(typeof(RootRolNode))]
        [KnownType(typeof(RolNode))]
        public class Node
        {
            [DataMember]
            public String Id { get; set; }
            [DataMember]
            public String Name { get; set; }
            [DataMember]
            public DepartmentNodeType Type { get; set; }
        }
    }


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;

    namespace MaxFlow.VO.OrgChart
    {
        [DataContract]
        public class GroupNode : Node
        {
            [DataMember]
            RootRolNode parentNode;

            [DataMember]
            public RootRolNode ParentNode
            {
                get { return parentNode; }
                set { this.parentNode = value; }
            }
        }
    }

    lunes, 15 de marzo de 2010 18:21