Frage

Diese Frage kann sehr ähnlich sein, meint, aber ich kann das nicht sehen antworte ich in es brauchen. Ich habe eine Klasse, genannt CASM, die eine List<Action> hat. Ich möchte diese Klasse serialisiert werden (mit dem BinaryFormatter oder so ähnlich). Diese Klasse und alle in den Actions referenzierten Klassen haben richtig [Serializable] und [NonSerializable] Attribute bekommen.

Das Problem kommt, wenn die Serialisierung versucht wird - es gibt diesen Fehler:

Type 'CASM.CASM+<>c__DisplayClass2c' in Assembly 'CASM, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Dieses <>c__DisplayClass2c ist eine automatisch generierte interne Klasse, die die verschiedenen Arten von anonymen Delegaten hält ich in meiner Anwendung verwende. Allerdings, wie wir aus dem Bild unten sehen können, ist es nicht [Serializable]:

alt text http://bayimg.com/image/maebbaacj.jpg

Was wäre der beste Weg, um meine Anwendung zu ändern, so funktionierts? Machen Sie meine eigene <>c__DisplayClass2c-Typklasse und machen es serializable? Oder gibt es einen besseren Weg?


EDIT: Am Ende habe ich meine eigene Klasse nur gemacht, anstelle des automatisch generierten ein. Ich hilft bei der Fehlersuche als auch, eigentlich eher einen beschreibenden Namen, die als nur b__12().

War es hilfreich?

Lösung

Es macht in der Regel sehr wenig Sinn, einen Delegierten zu serialisieren. Normalerweise würden Sie wählen Delegierten Felder als [NonSerialized] zu markieren, und neu erstellen, wenn nötig. Wenn Ihr Haupt Absicht ist die Delegierten zu speichern, dann würde ich denken an einen völlig anderen Ansatz empfehlen, ehrlich gesagt.

Zusätzlich ist zu beachten, dass BinaryFormatter ist spröde, wenn Sie die Daten für längere Zeit zu halten planen (aber akzeptabel für transiente Daten)

weiter suchen, vermute ich, wir müssen zu einem bestimmten reproduzierbaren Code suchen.


Update: tatsächlich, ich vermute, Sie könnte serialisiert es durch eigene explizite Erfassung Klassen schreiben (statt der vom Compiler erzeugten sind). Aber ich denke immer noch das Konzept grundlegend fehlerhaft ist. Und das Schreiben Capture Klassen von Hand macht keinen Spaß.


Um die Punkte in den Kommentaren zu befassen; re Langzeitlagerung - denn es ist so verflixt spröde - etwas so einfaches wie Wechsel von:

public int Value {get;set;}

private int value;
public int Value {
    get {return value;}
    set {
        if(value < 0) throw new ArgumentOutOfRangeException();
        this.value = value;
    }
}

zerstören Serialisierung; als Wille Ändern Baugruppen, Typnamen „betrachten es lustig“, etc.

Re die Delegierten; ein Beispiel einer manuellen Erfassung zu geben; Statt:

int i = ...
Predicate<Foo> test = delegate (Foo x) { return x.Bar == i;}

Sie können tun:

int i = ...
MyCapture cpt = new MyCapture(i);
Predicate<Foo> test = cpt.MyMethod;

mit

[Serializable]
class MyCapture {
    private int i;
    public MyCapture(int i) {this.i = i;}
    public bool MyMethod(Foo x) {return x.Bar == i;}
}

Wie Sie sehen können -. Nicht immer trivial (dies ist die einfachste Beispiele)

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