Wo ist dieses nicht-serialisierbare Objekt?
-
24-10-2019 - |
Frage
Ich versuche, ein Objekt zu serialisieren, und die folgende Serialisierung wird ausgeworfen:
Typ 'system.linq.enumerable+d__71`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = B77A5C561934E089]' In Assembly 'System.core, Version = 4.0.0.0, Culture = Culture = Culture = Neutral, PublicKeyToken = B77A5C561934E089 'ist nicht als serialisierbar markiert.
Wo ist dieses Objekt in meinem Code? Wie würde ich es herausfinden? Das Objektdiagramm ist ziemlich groß.
Lösung
Versuchen Sie, Reflektor zu verwenden, und prüfen Sie, ob Sie feststellen können, wo der anonyme Typ d__71`1
wird in Ihrem Code verwendet.
Andere Tipps
Klingt für mich so, als hätten Sie die Ergebnisse des Aufrufens einer Enumerator -Methode gespeichert, ohne das Ergebnis in eine Liste zu konvertieren.
Wenn Sie eine solche Methode haben:
public IEnumerable<string> GetMyWidgetNames()
{
foreach (var x in MyWidgets)
{
yield return x.Name;
}
}
Der Compiler verwandelt dies in ein verschachteltes Objekt mit einem Namen wie dem, den Sie sehen (einer mit einem Namen, den Sie sich wegen der eingebetteten nie selbst erstellen konnten +
)
Wenn Sie dann einen Verweis auf dieses Objekt in etwas speichern, das Sie serialisieren möchten, erhalten Sie die vom OP festgelegte Ausnahme.
Das "Fix" besteht darin, sicherzustellen, dass Ihre serialisierten Objekte immer alle iEnumerable -<> -Ammeldungen in Listen umwandeln. An Stelle von
public IEnumerable<string> WidgetNames { get; set; }
Sie müssen schreiben:
public IEnumerable<string> WidgetNames
{
get { return mWidgetNames; }
set
{
if (value == null)
mWidgetNames= null
else mWidgetNames= value.ToList();
}
}
private List<string> mWidgetNames;
Versuchen Sie, jeweils ein Objekt (einzelner Typ) zu serialisieren, und sehen Sie, wann es aufbläst. Sie können dies manuell oder durch Reflexion tun.