Classes imbriquées avec / même nom dans les assemblées séparées Causer sérialisation Maux de tête

StackOverflow https://stackoverflow.com/questions/1481869

Question

Je travaille avec une API mal conçu. J'ai une classe que je dois sérialisation, et je contrôle sur la composition de la classe, mais pas les types qui composent les propriétés de la classe est serialzing. Un exemple est ci-dessous:

<Project>
  <SomeProperty1 />
  <Install>
    <DefaultStep></DefaultStep>
  </Install>
  <Uninstall>
    <DefaultStep></DefaultStep>
  </Uninstall>
</Project>

Le problème est, je ne contrôle pas les « Installer » et types « Désinstaller », et leurs types imbriqués ont le même nom. « Installer » réside dans MyCompany.Install.dll et « Désinstaller » réside dans MyCompany.Uninstall.dll. Mais le kicker est, de MyCompany.Uninstall.dll MyCompany.Install.dll, ce qui est tout à fait inutile. Je sais que c'est une mauvaise conception (l'ensemble du cadre que je traite est terrible), mais je n'ai pas le choix de travailler avec elle.

L'erreur que je reçois est:

  

"Types   'MyCompany.Install.Uninstall.DefaultStep'   et « MyCompany.Install.DefaultStep »   à la fois utiliser le nom de type XML,   'DefaultStep', de '' namespace. Utilisation   attributs XML pour spécifier un XML unique,   nom et / ou espace de noms pour le type. "

Ce serait une bonne idée, sauf que j'ai le contrôle zéro sur les ensembles qui contiennent les « Install » et les classes « Désinstaller ».

Toutes les idées?

Était-ce utile?

La solution 2

J'ai trouvé une réponse qui fonctionne. Commentaires dans cet article: http://www.codeproject.com/KB/XML/xmlserializerforunknown .aspx

Led moi à cet article: http://mfharoon.blogspot.com/2006/ 12 / utilisant-IXmlSerializable à surmonter-not.html

La seule chose que vous devez changer est la ligne 108, qui doit lire:

writer.WriteAttributeString ( "type", _parameters.GetType () AssemblyQualifiedName.ToString ().);

qui permettra le travail de sérialisation si le type est un ensemble séparé.

HTH!

Autres conseils

Si vous avez accès à .NET 3.5, j'utiliser le sérialiseur DataContract, et mettre en œuvre un IDataContractSurrogate. sérialisation Surrogate vous permet de remplacer un type pointilleux qui merdait sérialisation avec un autre type au moment de sérialisation. Vous avez le contrôle total sur la mère porteuse. Cela devrait vous aider à résoudre le problème.

http://msdn.microsoft.com /en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx

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