Usuario
Pasar un objeto personalizado a través de WCF 3.5

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