Question

Je veux passer un ensemble assez générique de données par une méthode de WCF. Les données sont fondamentalement juste un ensemble hiérarchique de paires clé / valeur, mais elle est imbriquée à un niveau arbitraire. Je l'ai considéré à l'origine en passant que comme une seule chaîne et de faire XML ou JSON ou un codage similaire / décodage à chaque extrémité, mais étant donné que le transport WCF XML est de toute façon qui semblait un peu idiot, donc j'espère qu'il ya un moyen de passer à travers "naturellement".

La méthode est assez simple:

[OperationContract]
void ProcessData(DataTree tree);

avec:

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

Tout cela compile bien, mais lorsque je tente d'exécuter le service, il se bloque avec un StackOverflowException sous DataContract.GetStableName.

Je l'ai essayé de mettre un attribut [CollectionDataContract] sur la classe DataTree et en spécifiant explicitement tous les noms, mais cela ne semble pas faire de différence.

J'ai aussi essayé de mettre un [DataContract] là-dessus, mais il échoue encore plus tôt parce que Dictionary est ISerializable.

Toutes les idées? Y at-il une meilleure façon de le faire?

Était-ce utile?

La solution 2

En fait, une autre exigence est venu (en spécifiant une valeur simple pour un nœud en plus d'une liste des enfants), donc j'ai fini par définir un type d'enfant pour elle de toute façon, qui semble avoir fait WCF heureux avec elle :

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

Autres conseils

Pour les grands arbres d'objet dans le passé, j'ai sérialisé moi-même les données à un tableau d'octets qui est envoyé sur avec WCF (et WCF ne doivent pas être SOAP / XML si vous avez WCF dans les deux extrémités), puis désérialisé manuellement sur l'extrémité de réception.

Fondamentalement créer un Serialize(BinaryWriter writer) et DeSerialize(BinaryReader reader) pour les classes en question qui se sérialise et passe l'écrivain / lecteur vers le bas pour les objets enfants pour sérialisation récursive.

Vous pouvez également regarder dans protobuf-net pour la sérialisation / désérialisation. Soit que le transport de votre appel WCF, ou manuellement, et le passage d'un tableau d'octets sur le fil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top