我最近在我正在开发的一个应用程序中实现了一个复制和粘贴功能。这几乎可以达到预期的效果。
我在我的用户界面中创建了一个新项目,并且可以随时复制和粘贴它,而不会出现任何问题。
但是,当我复制并粘贴由上一次复制和粘贴操作生成的项目时,我得到了一个SerializationException
。它会抱怨某个类型没有被标记为可序列化。
这就是混乱的开始。第一个复制和粘贴操作与第二个操作与相同类型的对象交互。但第二个结果是异常。
更详细地说,我有一个类Slide
,这是复制和粘贴操作的目标类。因此,我将该对象的一个实例放在剪贴板中,并将其再次粘贴到同一个容器中。这就像预期的那样。现在我复制插入的对象并尝试粘贴它。这是抛出异常的时候。该异常抱怨类SlideEditorUi
。SlideEditorUi
是一个与名为SlideEditor
的类交互的UserControl
。它又与Slide
实例交互。但是没有一个Slide
实例有一个对上述任何类的引用。
所以我真的想知道为什么序列化过程要考虑这个类。为什么它只在我复制副本时才这样做?
发布于 2010-07-21 22:51:02
通常,此场景中的问题是事件持有对另一个对象的引用。BinaryFormatter
跟随底层字段返回到对象,然后爆炸。
如果你能找到有问题的事件,你可以使用(对于“类似字段的”事件):
[field:NonSerialized]
public event SomeEventHandler EventName;
或者,对于显式实现,请将[NonSerialized]
添加到支持字段。
或者,使用BinaryFormatter
之外的其他格式;p或xml生成可以通过字符串使用的简单格式,或者对于较大/较复杂的对象,可以使用其他二进制序列化格式。
发布于 2010-07-21 22:36:18
错误是关于您的数据对象中不包含SerializableAttribute
的一部分。为什么它不抛出序列化,而抛出重新序列化,我不知道。也许看到你想要序列化的POCO会更好一些。我怀疑的是,您确实遗漏了属性或字段的该属性。
请注意以下内容(来自上面的文档链接),特别是。“图”这个词意味着父类、聚合和引用的所有类都需要是可序列化的,这样才不会抛出错误:
将SerializableAttribute属性应用于类型,以指示此类型的实例可以序列化。如果要序列化的对象图中的任何类型未应用SerializableAttribute属性,则公共语言运行库将引发SerializationException。
https://stackoverflow.com/questions/3304377
复制