0

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

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意思?

4

2 回答 2

5

谷歌搜索您的 c_DisplayClass1'1 并发现以下内容:

http://rantdriven.com/post/2011/07/09/The-Mysterious-2b3c3ec__DisplayClass1.aspx

它有一些关于它如何成为您尝试序列化的事件处理程序的链接和解释。

这似乎是一个有用的评论:

主要问题与正在序列化的内容有关。默认情况下,事件处理程序在内部由编译时生成的字段表示。此字段包含对在引发事件时要调用的委托的引用。

使用上面的示例,由于您使用的是访问超出其定义范围的资源的匿名方法,因此会导致异常。在幕后,创建了一个类(可能称为“<>c__DisplayClass1”)来表示匿名方法。此方法没有使用 [Serializable()] 属性进行标记。当您尝试序列化对象时,它会尝试序列化其字段并引发异常。

您可以通过以下几种方式之一修复您的代码:

如果您想维护事件的序列化(默认情况下对于 Serializable 类是开启的),最简单的方法是将您的“addedMessage”变量移动到匿名方法中,这样它就不会访问包含范围。

如果事件的序列化对您来说并不重要,您可以手动声明您的事件字段,使用 [NonSerialized()] 属性对其进行标记,然后使用事件块上的添加和删除访问器来管理委托引用。

于 2013-05-18T21:52:38.703 回答
0

您正在尝试序列化编译器生成的未标记为可序列化的闭包类。没有办法让那些用Serializable属性注释。

于 2013-05-18T21:49:53.207 回答