2009-05-14 2 views
3

Nous sommes migration de Remoting à WCF une très grande application qui utilise intensivement les DataSets. Nous utilisons les propriétés ExtendedProperties des tables DataSets pour stocker un graphique d'objets contenant des informations spéciales dont nous avons besoin côté client. Dans notre implémentation de Remoting, nous avons ajouté à la pile de canaux un client et un serveur pour vérifier si le message contenait un jeu de données et utiliser un sérialiseur xml pour pouvoir envoyer des ExtendedProperties via le réseau (vous pouvez savoir que l'ensemble de données serializer fait un ToString() des éléments trouvés dans ExtendedProperties). Nous l'avons fait de cette façon, donc c'était transparent pour les règles métier et les développeurs de l'interface utilisateur. Que devrions-nous surcharger ou implémenter dans WCF pour pouvoir gérer le DataSet avant qu'il ne soit sérialisé en xml/soap par le canal wcf? C'est possible? Je sais déjà que nous devons éviter d'utiliser des ensembles de données dans wcf, mais nous avons plus de 200 formulaires utilisant des ensembles de données et les changer tous n'est pas une option pour le moment.Comment pouvons-nous sérialiser de façon transparente les ExtendedProperties de Dataset dans WCF?

Merci beaucoup!

Répondre

2

Je me demande si vous ne pouvez pas échanger sérialiseur en ajoutant un attribut de comportement à chaque extrémité ... étant donné un XmlReader/XmlWriter, l'approche de:

dataset.WriteXml(xmlWriter, XmlWriteMode.WriteSchema); 

et

dataset.ReadXml(xmlReader, XmlReadMode.ReadSchema); 

semble fonctionner (les propriétés étendues sont respectées), vous devriez donc être capable d'écrire un comportement qui détecte DataSet et permute vers un sérialiseur personnalisé - comme ceci (attribute | behaviour | serializer) - mais probablement plus simple. Je peux regarder plus tard si cela ne suffit pas pour commencer ...

+0

Oui, les WriteXml sérialisent déjà le contenu ExtendedProperties, mais en faisant un ToString() de l'objet. Ce dont j'ai besoin, c'est d'avoir un point juste avant la sérialisation et un autre juste après la désérialisation pour me permettre de transformer une chaîne en mes objets personnalisés. Vous m'avez donné un bon indice avec le DataContractSerializerOperationBehavior, je vais essayer avec celui-ci et vous communiquer mes résultats. – jmservera

1

Vous pouvez envisager de passer à NetDataContractSerializer. Il est capable de sérialiser tous les types .NET sérialisables, y compris ceux qui supportent ISerializable, et il gère entièrement les cycles dans de tels graphes. Mais cela ne fonctionnera que si vous allez consommer votre service WCF par un client .NET.

1

Tout d'abord merci pour vos réponses. J'ai finalement trouvé comment changer le sérialiseur avec un mélange de la réponse de Marc et une entrée de Nicholas Allen's Indigo Blog.

Merci.

+0

Je vais devoir le lire. Je suis content que la réponse m'a aidé. –

+0

Lol - vous avez balayé et accepté une réponse environ 5 minutes après la fermeture - bravo ;-p –

Questions connexes