gpt4 book ai didi

c# - 序列化匿名委托(delegate)列表

转载 作者:行者123 更新时间:2023-11-30 15:49:27 25 4
gpt4 key购买 nike

This question可能与我的非常相似,但我看不到我需要的答案。我有一个类,叫做 CASM ,它有一个 List<Action> .我想序列化这个类(使用 BinaryFormatter 或类似的东西)。 Action 中引用的此类和所有类s 有正确的 [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是一个自动生成的内部类,它包含我在我的应用程序中使用的不同类型的匿名委托(delegate)。但是,正如我们从下图中看到的,它不是[Serializable]。 :

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

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


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

最佳答案

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

此外,请注意,如果您计划将数据保留任意时间长度(但对于 transient 数据是可接受的),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;}
}

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

关于c# - 序列化匿名委托(delegate)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1618530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com