3

这个问题可能与我的问题非常相似,但我看不到我需要的答案。我有一个名为 的类CASM,它有一个List<Action>. 我想序列化这个类(使用BinaryFormatter或类似的东西)。这个类和Actions 中引用的所有类都有正确的[Serializable][NonSerializable]属性。

尝试序列化时出现问题 - 它给出了这个错误:

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

<>c__DisplayClass2c是一个自动生成的内部类,它包含我在应用程序中使用的不同类型的匿名委托。但是,正如我们从下图中看到的那样,它不是[Serializable]

替代文字 http://bayimg.com/image/maebbaacj.jpg

更改我的应用程序以使其有效的最佳方法是什么?制作我自己的<>c__DisplayClass2c-type 类并使其可序列化?或者,还有更好的方法?


编辑:最后我只是制作了自己的课程,而不是自动生成的课程。我也帮助调试,实际上有一个描述性的名称,而不仅仅是b__12().

4

1 回答 1

4

序列化委托通常没有什么意义。通常,您会选择将委托字段标记为[NonSerialized],并在需要时重新创建它。如果您的主要意图存储代表,那么坦率地说,我建议您考虑一种完全不同的方法。

此外,请注意,BinaryFormatter如果您计划将数据保留任何时间长度(但对于瞬态数据是可以接受的),这会很脆弱

为了进一步了解,我怀疑我们需要查看一些可重现的代码。


更新:实际上,我怀疑您可以通过编写自己的显式捕获类(而不是编译器生成的类)来序列化它。但我仍然认为这个概念存在根本缺陷。手动编写捕获类并不好玩。


解决评论中的要点;重新长期储存——因为它太脆了——就像改变一样简单:

public int Value {get;set;}

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

将破坏序列化;更改程序集、类型名称、“看起来很有趣”等也是如此。

重新代表;举一个手动捕获的例子;代替:

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

你可能会这样做:

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

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

如您所见 - 并不总是微不足道的(这是最简单的示例)。

于 2009-10-24T17:53:12.453 回答