This question可能与我的非常相似,但我看不到我需要的答案。我有一个名为CASM
的课程,其中有一个List<Action>
。我想序列化这个类(使用BinaryFormatter
或类似的东西)。此类以及Action
中引用的所有类都具有正确的[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]
:
alt text http://bayimg.com/image/maebbaacj.jpg
更改我的应用程序的最佳方法是什么?创建我自己的<>c__DisplayClass2c
- 类类并使其可序列化?或者有更好的方法吗?
编辑:最后我创建了自己的课程,而不是自动生成课程。我也帮助调试,实际上有一个描述性的名称,而不仅仅是b__12()
。
答案 0 :(得分:4)
序列化委托通常没什么意义。通常,您可以选择将委托字段标记为[NonSerialized]
,并在需要时重新创建它。如果您的主要意图是 来存储代表,那么我会建议您考虑一种完全不同的方法,坦率地说。
此外,请注意,如果您计划将数据保留一段时间(但暂时数据可接受),BinaryFormatter
会很脆弱
进一步观察,我怀疑我们需要查看一些可重现的代码。
更新:实际上,我怀疑你可以通过编写自己的显式捕获类(而不是编译器生成的类)来序列化它。但我仍然认为这个概念存在根本缺陷。手工编写捕获类并不好玩。
解决评论中的要点;重新长期存储 - 因为它是so darned brittle - 简单到改变:
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;}
}
正如您所看到的 - 并非总是微不足道(这是最简单的例子)。