C# 在具有匿名方法的类上使用XmlSerializer
我想序列化一个在实现中使用匿名函数的类。编译器正在生成一个内部类来实现匿名函数。序列化程序失败,错误为:“MyClass+c__DisplayClass2由于其保护级别而不可访问。只能处理公共类型。”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{
公共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>
{
}