Pregunta

Quiero pasar una serie bastante genérico de datos a través de un método de WCF. Los datos son básicamente un conjunto jerárquico de pares clave / valor, pero está anidado a un nivel arbitrario. Originalmente consideré que pasa, aunque como una sola cadena y haciendo XML o JSON o codificación similares / decodificación en cada extremo, pero dado que el transporte WCF es de todos modos XML que parecía un poco tonto, así que estoy esperando que hay una manera de pasarla a través "naturalmente".

El método es bastante sencillo:

[OperationContract]
void ProcessData(DataTree tree);

por:

public class DataTree : Dictionary<string, DataTree>
{
}

Esta compila bien todo, pero cuando trato de ejecutar el servicio que se bloquea con un StackOverflowException bajo DataContract.GetStableName.

He intentado poner un atributo de la clase [CollectionDataContract] DataTree y explícitamente especificando todos los nombres, pero que no parecía hacer ninguna diferencia.

También he intentado poner un [DataContract] en él, pero entonces se produce un error aún más temprano, porque es Dictionary ISerializable.

Algunas ideas? ¿Hay una mejor manera de hacer esto?

¿Fue útil?

Solución 2

Al final resultó que, otro requisito acercó (especificando un valor simple para un nodo, además de una lista de los niños), así que terminé definir un tipo de niño de todos modos, que parece haber hecho feliz a WCF con ella :

[CollectionDataContract(IsReference = true, ItemName = "Param",
                        KeyName = "Name", ValueName = "Data")]
public class DataTree : Dictionary<string, DataTreeEntry>
{
}

[DataContract]
public class DataTreeEntry
{
    [DataMember]
    public string Value { get; set; }

    [DataMember]
    public DataTree Children { get; set; }
}

Otros consejos

Para grandes árboles de objetos en el pasado he serializado los datos yo a una matriz de bytes que se envían a través de la WCF (WCF y no tienen que ser SOAP / XML si tiene WCF en ambos extremos), y luego deserializado de forma manual en el extremo receptor.

Básicamente crear un Serialize(BinaryWriter writer) y DeSerialize(BinaryReader reader) para las clases en cuestión que serializa en sí, y pasa el escritor / lector a los objetos secundarios para la serialización recursiva.

También puede mirar en el uso protobuf-net para la serialización / deserialización. Ya sea como el transporte en su llamada WCF, o de forma manual, y pasando una matriz de bytes sobre el alambre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top