XmlSerializer avec de nouvelles valeurs enum
Nous utilisons sérialisation /désérialisation largement dans notre projet pour transmettre les données entre plusieurs applications. Nous avons d'un commun xsd de générer des classes c# à partir de là utiliser XmlSerializer pour aller de xml aux objets et à l'arrière.
Le problème que nous allons avoir, c'est quand une application est mise à jour pour ajouter de nouvelles valeurs enum mais l'autre application n'est pas encore été mis à jour. Maintenant, l'application qui n'est pas mis à jour tente de désérialiser le xml et échoue parce qu'il ne sait pas à propos de la nouvelle enum.
Si nous avons app1 et app2, les choses fonctionnent correctement dans le champ, puis app2 est mise à jour avec une nouvelle valeur d'enum dans le xsd et mis à jour pour le client dans le domaine. Soudain, app1 pauses car il ne sait pas à propos de l'enum, app1 pourrait même ne pas l'utiliser enum domaine, n'a pas d'effet sur app1, mais il se casse encore.
Sont-ils connus des façons de contourner cela. Fondamentalement, ce que je veux faire est de définir ce que faire quand un enum n'est pas trouvé, l'utilisation d'une valeur par défaut ou si l'enum comme un nullible type et à la valeur null.
Les deux XmlSerializer et DataContractSerializer lancer des exceptions à cette situation.
J'ai regardé la coutume de la sérialisation xml projet YAXLib (http://www.codeproject.com/KB/XML/yaxlib.aspx) présente également lève une exception, mais il y a le code source et peut être modifié. Ce projet de l'utilisation des différentes propriétés des attributs et aurait besoin d'un peu de changement, mais est probablement faisable.
Toute autre suggestion.
OriginalL'auteur scott | 2009-10-25
Vous devez vous connecter pour publier un commentaire.
Malheureusement il n'y a aucun moyen de contrôler la façon dont les valeurs de l'enum sont désérialisé... Comme une solution de contournement, vous pouvez sérialiser les valeurs enum comme une chaîne de caractères :
Nous ne parlons pas des domaines inconnus ici (vous pouvez les traiter avec XmlAnyElement ou XmlAnyAttribute), nous parlons d'un inconnu les valeurs de l'enum...
OriginalL'auteur Thomas Levesque
De référence pour l'avenir, le mieux je pense est d'utiliser XmlEnumAttribute qui raconte le XMLSerializer ce nom de chaque valeur d'énumération a pour la sérialisation et la désérialisation.
OriginalL'auteur Sam Bauwens
J'ai été confrontées à ce problème, et j'en ai trouvé une solution partielle à l'aide de XmlAttributeOverrides. Par la MS documentation:
J'ai donc fait ceci:
Le seul problème que j'ai trouvé avec cette approche est que je ne peux pas spécifier plusieurs valeurs pour un seul enum...
OriginalL'auteur jwill212
J'ai récemment rencontré ce même problème avec le DataContractSerializer. Fondamentalement, l'enum processus de désérialisation est impitoyable, à cet égard, ce qui rend presque impossible de gérer la compatibilité descendante.
Pour contourner ce problème, j'ai décidé d'utiliser un champ de stockage et de gérer l'enum de conversion moi-même.
Le domaine privé peuvent être désérialisés par le DataContractSerializer, mais le XmlSerializer aurait besoin d'un champ public.
OriginalL'auteur Chris Gessler
Vous pouvez faire de la production de l'application consciente des multiples versions des applications gourmandes et ont l'utiliser différents espaces de noms XML et de C#, pour chacune des versions. Il doit y avoir une certaine coordination à l'avant entre les applications d'accord sur le schéma dans lequel ils seront la suite et il n'y isadditional responsabilité sur la production de l'application pour continuer à être compatible avec l'ensemble possible des consommateurs actifs applications.
OriginalL'auteur GBegen
utiliser le c# sérialisation personnalisée avec la gestion des versions des objets; cela vous permettra de gérer les diverses situations qui se présentent lorsqu'une application est mise à jour et l'autre n'est pas
OriginalL'auteur Aaron Saunders
Meilleure façon est de partager la sérialisation/désérialisation code entre les 2 applications
Mais si il n'est pas possible, vous pouvez utiliser XmlAttributeOverrides assez largement contrôle comment xml sera désérialisé. Par exemple, ci-dessous une ancienne version de xml nous voulons désérialisé
Dans la nouvelle version de style de la propriété est codé comme enum type de Style
Si nous essayons de désérialiser les données xml, nous allons obtenir exception.
Nous pouvons utiliser XmlAttributeOverrides pour éviter ce
OriginalL'auteur hongkilldong