实体可序列化时出现奇怪的序列化错误

时间:2013-05-18 21:43:47

标签: c# serializable

尝试序列化对象时出现以下错误:

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甚至意味着什么?

2 个答案:

答案 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属性进行注释。