Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化匿名委托列表_C#_.net_Serialization_Anonymous Methods_Anonymous Class - Fatal编程技术网

C# 序列化匿名委托列表

C# 序列化匿名委托列表,c#,.net,serialization,anonymous-methods,anonymous-class,C#,.net,Serialization,Anonymous Methods,Anonymous Class,可能和我的很相似,但我看不到我需要的答案。我有一个名为CASM的类,它有一个列表 更改我的应用程序以使其正常工作的最佳方法是什么?制作我自己的c_udisplayClass2C-类型类并使其可序列化?还是有更好的办法 编辑:最后我只是创建了自己的类,而不是自动生成的类。我还帮助调试,实际上有一个描述性的名称,而不仅仅是b_uu12()序列化委托通常没有什么意义。通常,您会选择将代理字段标记为[NonSerialized],并在需要时重新创建它。如果您的主要目的是存储代理,那么坦率地说,我建议您

可能和我的很相似,但我看不到我需要的答案。我有一个名为
CASM
的类,它有一个
列表

更改我的应用程序以使其正常工作的最佳方法是什么?制作我自己的
c_udisplayClass2C
-类型类并使其可序列化?还是有更好的办法



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

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

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

为了进一步研究,我怀疑我们需要研究一些可复制的代码


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


处理评论中的要点;我们需要长期存储—因为它是—简单到可以从以下内容更改:

public int Value {get;set;}


正如您所看到的-并不总是琐碎的(这是最简单的示例)。

您说该类是自动生成的-它是如何完成的?你能控制它吗?它是由第三方组件生成的吗?它是由编译器自动生成的-它具有[CompilerGenerated]属性。我认为它只是一个类/位置,用于存储许多非常相似的匿名委托(在本例中,它们都是空的,并且接受字符串[]作为参数)。然后,是的,尝试生成您自己的类。匿名方法也可能有问题(我没有尝试过,所以我不知道),在这种情况下,请尝试非匿名版本。即使这样也不行,你也可以试着先把方法转换成表达式(那些应该是可序列化的)编译表达式树遇到的问题与你仍然需要生成自动生成类的操作完全相同。我知道这样的注释即将出现——这似乎是一件非常奇怪的事情。然而,对于我正在尝试做的事情,代理似乎是最好(或至少是最快)的方法。创建代理需要(相对)较长的时间,因此如果我可以存储它们就好了。在查看Nader Shirazie评论中的表达式树之后,我现在意识到,我实际上是在尝试重新创建一个有限的表达式树系统/语法(即从代理构建代码)。为什么BinaryFormatter不适合长期存储数据?啊,谢谢。所以像protobuf net或XML这样的另一个系统不会有这种“脆弱”的问题,因为它们不存储类型/版本/程序集等;大多数序列化程序只存储数据;这使得它独立于实现,并且通常更短<代码>二进制格式化程序
存储类型/字段信息,这是非常特定于实现的。
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;}
}