Question

J'utilise un XmlSerializer pour désérialiser un type particulier dans mscorelib.dll

XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );

Cela jette un pris FileNotFoundException lorsque l'assembly est chargé :

"Impossible de charger le fichier ou l'assemblage 'mscorlib.xmlserializers, version = 2.0.0.0, culture = neutre, publicKeyToken = B77A5C561934E089' ou l'une de ses dépendances.Le système ne peut pas trouver le fichier spécifié."

FusionLog :

=== Pre-bind state information ===
LOG: User = ###
LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
 (Fully-specified)
LOG: Appbase = file:///C:/localdir
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\localdir\bin\Debug\appname.vshost.exe.Config
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.EXE.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.EXE.

Pour autant que je sache, il n'y a pas de mscorlib.XmlSerializers.DLL, je pense que le nom de la DLL a été généré automatiquement par .Net à la recherche du sérialiseur.

Vous avez la possibilité de créer un myApplication.XmlSerializers.DLL lors de la compilation pour optimiser les sérialisations, donc je suppose que cela fait partie de la vérification du framework.

Le problème est que cela semble entraîner un retard dans le chargement de l'application - elle semble se bloquer pendant quelques secondes à ce stade.

Avez-vous des idées pour éviter cela ou l'accélérer ?

Était-ce utile?

La solution

Je suppose maintenant.mais:

  1. Le système génère peut-être un sérialiseur pour l'ensemble de mscorlib, ce qui pourrait être très lent.
  2. Vous pourriez probablement éviter cela en encapsulant le type de système dans votre propre type et en le sérialisant à la place - vous obtiendrez alors un sérialiseur pour votre propre assemblage.
  3. Vous pourrez peut-être créer le sérialiseur pour mscorlib avec sgen.exe, qui était l'ancienne façon de créer des DLL de sérialiseur avant son intégration dans VS.

Autres conseils

Le retard est dû au fait que, n'ayant pas pu trouver la DLL du sérialiseur personnalisé, le système construit le code équivalent (ce qui prend beaucoup de temps) à la volée.

Le moyen d'éviter ce retard est de demander au système de créer la DLL et de s'assurer qu'elle est disponible pour le .EXE - avez-vous essayé cela ?

D'accord, j'ai donc rencontré ce problème et j'ai trouvé une solution spécifique à ma région.

Cela s'est produit parce que j'essayais de sérialiser une liste dans un document XML (fichier) sans attribut racine XML.Une fois que j'ai ajouté les fichiers suivants, l'erreur disparaît.

XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;

Je ne sais pas si cela résoudra votre problème, mais cela a résolu le mien.

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