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ß.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top