2010-06-01 2 views
1

Je dois sérialiser les classes de types chargés dynamiquement à l'aide de XMLSerializer. Lors de l'utilisation du sérialiseur XML, les valeurs non initialisées ne sont pas sérialisées. Je n'ai pas de contrôle sur les assemblages avec lesquels je travaille, donc je ne peux pas utiliser les attributs XML pour spécifier les valeurs par défaut sur les propriétés. Je pense donc que j'ai besoin de définir récursivement toutes les propriétés et sous-propriétés à leurs valeurs par défaut, puis sérialiser. (S'il vous plaît laissez-moi savoir s'il y a une meilleure façon)Comment définir les valeurs par défaut pour les propriétés des types chargés dynamiquement à l'exécution pour la sérialisation XML

Suivi this:

Activator.CreateInstance (PropType);

mais au-dessus de la ligne se plaint de ne pas avoir un constructeur sans paramètre pour certains types.

Essayé this: subObject = FormatterServices.GetUninitializedObject (propType); mais celui-ci donne une erreur "valeur invalide" sans exception interne.

S'il vous plaît laissez-moi savoir si vous avez besoin de plus amples informations.

Répondre

1

Si les types en question n'ont pas de constructeur public sans paramètre, vous aurez du mal à vous en sortir. Vous pouvez contourner le problème d'attributs en utilisant le constructor overload qui accepte un objet XmlAttributeOverrides, que vous pouvez utiliser pour configurer complètement le sérialiseur y compris la valeur par défaut (via XmlAttributes.XmlDefaultValue), mais certaines choses que vous ne pouvez pas faire - et contourner la limitation du constructeur est l'un d'eux.

Quel est le scénario ici?

  • si vous voulez xml, alors j'introduirait une couche DTO: certains objets qui ressemblent comme ceux dont vous parlez, mais sont simples et sous votre contrôle. Idéal pour XmlSerializer. Vous écrivez ensuite le code pour mapper entre les deux
  • si vous voulez juste la sérialisation (et xml est un détail d'implémentation) alors il y a d'autres sérialiseurs qui peuvent aider. DataContractSerializer ou protobuf-net, par exemple; soit serait plus polyvalent ici.
Questions connexes