尝试序列化对象时出现以下错误:
Type
'TEST.Common.TestObj`1+<>c__DisplayClass1`1[[TEST.Common.TestEntity,
TEST.Common, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null],[System.Boolean, mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]' in Assembly
'Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
is not marked as serializable.
Run Code Online (Sandbox Code Playgroud)
我[Serializable]在TestObj实体、所有它的基础实体和与其属性相关的所有实体上都有该属性。还有什么可能导致此“未标记为可序列化”错误?
c__DisplayClass1`1甚至是什么意思?
用谷歌搜索你的 c_DisplayClass1'1 并找到以下内容:
http://rantdriven.com/post/2011/07/09/The-Mysterious-2b3c3ec__DisplayClass1.aspx
它有一些关于它如何成为您尝试序列化的事件处理程序的链接和解释。
这似乎是一个有用的评论:
主要问题与正在序列化的内容有关。默认情况下,事件处理程序在内部由编译时生成的字段表示。此字段包含对引发事件时要调用的委托的引用。
使用上面的示例,导致异常的原因是您使用匿名方法访问超出其定义范围的资源。在幕后,创建了一个类(可能称为“<>c__DisplayClass1”)来表示匿名方法。此方法不会使用 [Serializable()] 属性进行标记。当您尝试序列化对象时,它会尝试序列化其字段并引发异常。
您可以通过以下几种方式之一修复您的代码:
如果要维护事件的序列化(对于 Serializable 类,默认情况下启用),最简单的方法是将“已添加的消息”变量移动到匿名方法中,这样它就不会访问包含范围。
如果事件的序列化对您不重要,您可以手动声明您的事件字段,用 [NonSerialized()] 属性标记它,然后使用事件块上的添加和删除访问器来管理委托引用。