序列化匿名委托列表

这个问题可能与我的问题非常相似,但我看不出我需要的答案。 我有一个名为CASM的类,它有一个List 。 我想序列化这个类(使用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 -type类并使其可序列化? 或者,还有更好的方法?


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

序列化委托通常没什么意义。 通常,您可以选择将委托字段标记为[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 test = delegate (Foo x) { return x.Bar == i;} 

你可能会这样做:

 int i = ... MyCapture cpt = new MyCapture(i); Predicate 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;} } 

正如你所看到的 - 并非总是微不足道(这是最简单的例子)。