C# 在具有匿名方法的类上使用XmlSerializer

C# 在具有匿名方法的类上使用XmlSerializer,c#,xml-serialization,anonymous-function,C#,Xml Serialization,Anonymous Function,我想序列化一个在实现中使用匿名函数的类。编译器正在生成一个内部类来实现匿名函数。序列化程序失败,错误为:“MyClass+c__DisplayClass2由于其保护级别而不可访问。只能处理公共类型。” 公共类MyClass{ 公共doIt(){ int目标=0; 返回列表(){1}.Any(i=>i==objective); } } 新的XmlSerializer(typeof(MyClass)).Serialize(writer,MyClass); 如何序列化这个类?谢谢。如果您不想将doI

我想序列化一个在实现中使用匿名函数的类。编译器正在生成一个内部类来实现匿名函数。序列化程序失败,错误为:“MyClass+c__DisplayClass2由于其保护级别而不可访问。只能处理公共类型。”

公共类MyClass{
公共doIt(){
int目标=0;
返回列表(){1}.Any(i=>i==objective);
}
}
新的XmlSerializer(typeof(MyClass)).Serialize(writer,MyClass);

如何序列化这个类?谢谢。

如果您不想将doIt方法序列化,请使用
XMLIgnore
属性标记该doIt方法。

我无法用C#3.0和.NET 3.5 SP1重现此异常--您使用的是哪个工具集

请注意,
XmlSerializer
不序列化方法;仅限值和属性。您是否碰巧使用了另一个序列化程序?如果是,请将
SerializableAttribute
放在类定义上,如下所示

[Serializable]
public class MyClass{ ... }
这是我用来重现您的问题的代码,它在语义上是等价的

public class MyClass
{
    public bool doIt()
    {
        int objective = 0;
        return new List<int>() { 1 }.Any(i => i == objective);
    }
}

static class Program
{
    static void Main(string[] args)
    {
        new XmlSerializer(typeof(MyClass)).Serialize(new MemoryStream(), new MyClass());        
    }
}
公共类MyClass
{
公共图书馆
{
int目标=0;
返回新列表(){1}.Any(i=>i==objective);
}
}
静态类程序
{
静态void Main(字符串[]参数)
{
新的XmlSerializer(typeof(MyClass)).Serialize(新的MemoryStream(),新的MyClass());
}
}

您应该创建一个标记为serializable的新类并发送它,而不是返回列表

[Serializable]
class MyList : List<int>
{
}
[可序列化]
类MyList:List
{
}

XmlIgnore在方法上无效。问题是编译器正在编译时生成我无法直接控制的其他方法。很抱歉,在这种情况下,您可能需要使用
ISerializable
接口实现自定义序列化。你也可以看看这篇文章。www.codeproject.com/KB/cs/AnonymousSerialization.aspx您可能需要实现的另一个接口可能是
IXmlSerializable
。它将允许您直接控制xml生成。需要工作,但您可以在类中使用xml序列化程序。或者应该能够基于文档。你是对的,我的简化最终可以序列化。我确信我的问题是由匿名函数引起的,因为当我删除它时序列化错误消失了。哦,好吧,我不能在我的程序之外复制它。没有任何东西会返回列表。XmlSerializer不使用Serializable属性。
[Serializable]
class MyList : List<int>
{
}