尝试序列化对象时出现以下错误:
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.
我在[Serializable]
实体上都有TestObj
属性,所有它的基本实体以及与其属性相关的所有实体。还有什么可以导致这个“未标记为可序列化”的错误?
c__DisplayClass1`1
甚至意味着什么?
答案 0 :(得分:4)
用Google搜索你的c_DisplayClass1'1并找到以下内容:
http://rantdriven.com/post/2011/07/09/The-Mysterious-2b3c3ec__DisplayClass1.aspx
它有一些链接和解释,说明它可能是您尝试序列化的事件处理程序。
这似乎是一个有用的评论:
主要问题与被序列化的内容有关。默认情况下, 事件处理程序在内部由生成的编译时表示 领域。该字段包含对要调用的委托的引用 当事件被提出时。
使用上面的示例,因为您正在使用而导致异常 一种匿名方法,用于访问超出其定义范围的资源。 在封面下,一个类(可能称为“&lt;&gt; c__DisplayClass1”)是 创建以表示匿名方法。这种方法没有得到 标有[Serializable()]属性。当你尝试 序列化你的对象,它试图序列化它的字段和 抛出异常。
您可以通过以下几种方式之一修复代码:
如果你想在事件上保持序列化(通过 对于Serializable类的默认值,最简单的方法是移动 你的'addedMessage'变量进入匿名方法,以便它 不访问包含范围中的任何局部变量。
如果事件序列化对您不重要,您可以声明 手动设置事件字段,使用[NonSerialized()]标记 属性然后使用事件块上的添加和删除访问器 管理委托引用。
答案 1 :(得分:0)
您正在尝试序列化编译器生成的闭包类,该类未标记为可序列化。没有办法使用Serializable
属性进行注释。