2013-05-18 29 views
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甚至意味着?

+1

如何发布您的真实代码而不是让我们猜测您的类和代码?一个类似的[很好的问题](http://stackoverflow.com/questions/16629134/cant-reach-children-element-of-a-groupbox-after-serialize-it-wpf)尝试阅读和理解它。 – I4V

回答

4

Google搜索你的c_DisplayClass1'1,发现如下:

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

它有一个关于它如何可能是你想序列化的事件处理程序的一些链接和解释。

这似乎是一个有帮助的注释:

的主要问题有什么东西被序列化的事情。默认情况下, 事件处理程序在内部由编译时生成的 字段表示。该字段包含引发事件时要调用的代理的参考号 。

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

您可以修复你的代码的几种方法之一:

如果你想保持对事件(这是由 默认Serializable类)系列化,最容易做的就是移动 您的'addedMessage'变量放入匿名方法中,以使其 不访问包含范围中的任何本地变量。

如果事件的序列化是不是对你很重要,你可以手动声明 您的活动现场,与[非序列化()] 属性标记,然后用添加和事件块 上remove访问到管理委托参考。

+3

是的,9倍于10这原来是一个事件处理程序 –

0

您正在试图序列化一个编译器生成的闭包类,它没有标记为可序列化。无法使用Serializable属性注释这些注释。

+0

这通常意味着它是一个捕获的变量上下文类,由于事件处理程序 –