Question

Cette question peut être très similaire à la mienne, mais je ne vois pas le réponds j'ai besoin dedans. J'ai une classe, appelée CASM, qui a un List<Action>. Je souhaite sérialiser cette classe (à l'aide de BinaryFormatter ou de quelque chose de similaire). Cette classe et toutes les classes référencées dans les Action ont les attributs [Serializable] et [NonSerializable] corrects.

Le problème survient lorsque la sérialisation est tentée - cela donne cette erreur:

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

Ceci <>c__DisplayClass2c est une classe interne générée automatiquement qui contient les différents types de délégués anonymes que j'utilise dans mon application. Cependant, comme on peut le voir sur l'image ci-dessous, ce n'est pas b__12():

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

Quel serait le meilleur moyen de changer ma candidature pour que cela fonctionne? Créer ma propre classe de type <=> et la rendre sérialisable? Ou y a-t-il un meilleur moyen?

EDIT: À la fin, je viens de créer ma propre classe, au lieu de celle générée automatiquement. J'aide aussi au débogage, ayant un nom descriptif plutôt que simplement <=>.

Était-ce utile?

La solution

Il est généralement peu logique de sérialiser un délégué. Normalement, vous choisiriez de marquer les champs délégués comme [NonSerialized] et de le recréer si nécessaire. Si votre intention principale est de stocker les délégués, je vous conseillerais alors de penser à une approche complètement différente, franchement.

De plus, notez que BinaryFormatter est fragile si vous prévoyez de conserver les données pendant une durée indéterminée (mais acceptables pour les données transitoires)

Pour aller plus loin, je suppose que nous devrions examiner un code reproductible.

Mise à jour: en fait, je suppose que vous pourriez la sérialiser en écrivant vos propres classes de capture explicites (plutôt que celles générées par le compilateur). Mais je pense toujours que le concept est fondamentalement imparfait. Et écrire des classes de capture à la main n’est pas amusant.

Pour aborder les points dans les commentaires; Stockage à long terme - car il s’agit de si cassant - quelque chose d'aussi simple que de changer de:

public int Value {get;set;}

à

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

va détruire la sérialisation; de même que les assemblées changeantes, les noms de types, & "; le regarder drôle &"; etc .;

Re les délégués; donner un exemple de capture manuelle; au lieu de:

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

vous pourriez faire:

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

avec

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

Comme vous pouvez le constater - pas toujours trivial (c’est le plus simple des exemples).

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