Où se trouve cet objet non sérialisable?
-
24-10-2019 - |
Question
Je suis en train de sérialisation un objet et la SerializationException suivante est lancée:
Type 'System.Linq.Enumerable + d__71`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] à l'Assemblée « System.Core, Version = 4.0.0.0 , Culture = neutral, PublicKeyToken = b77a5c561934e089' est pas marqué comme sérialisable.
Où se trouve cet objet dans mon code? Comment puis-je savoir? Le graphique de l'objet est assez grand.
La solution
Essayez d'utiliser réflecteur et voyez si vous pouvez déterminer où le d__71`1
de type anonyme est utilisé dans votre code.
Autres conseils
me semble que si vous avez enregistré les résultats de l'appel d'une méthode de recenseur sans convertir le résultat à une liste.
Lorsque vous avez une méthode comme ceci:
public IEnumerable<string> GetMyWidgetNames()
{
foreach (var x in MyWidgets)
{
yield return x.Name;
}
}
Le compilateur transforme ceci en un objet imbriqué avec un nom comme celui que vous voyez (avec un nom que vous ne pourriez jamais vous créer en raison de la +
embarqué)
Si vous stockez ensuite une référence à cet objet à l'intérieur quelque chose que vous essayez de sérialiser, vous aurez l'exception notée par l'OP.
La « solution » est de faire en sorte que vos objets sérialisés convertissent toujours les missions IEnumerable <> dans des listes. Au lieu de cela
public IEnumerable<string> WidgetNames { get; set; }
vous devez écrire:
public IEnumerable<string> WidgetNames
{
get { return mWidgetNames; }
set
{
if (value == null)
mWidgetNames= null
else mWidgetNames= value.ToList();
}
}
private List<string> mWidgetNames;
Essayez de sérialisation un objet (type simple) à la fois et voir quand il explose. Vous pouvez le faire manuellement ou par réflexion.