序列化在示例项目中有效,但在应用程序中无效

时间:2011-06-13 10:23:15

标签: c# .net serialization

在我正在开发的应用程序中,我在序列化自定义类时发现了一个问题。它是一个派生自Generic Tree类的类,所以我们称之为DerivedFromTree。 Tree类在另一个程序集中。

[Serializable]
class DerivedFromTree : Tree<UnderlyingTreeType>
{
    ...
}

为了解决我的问题,我创建了一个新的控制台项目,添加了DerivedFromTree文件及其依赖项,并添加了对Tree所在的DLL的引用。然后添加以下代码:

DerivedFromTree dft = new DerivedFromTree("label");
UnderlyingTreeType utt = new UnderlyingTreeType(...);
dft.AddChild(utt);
utt = new UnderlyingTreeType(...);
dft.AddChild(utt);

MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, dft);
ms.Position = 0; // position stream to 0
DerivedFromTree dft_result = (DerivedFromTree)bf.Deserialize(ms);

在示例项目中运行此代码后,dft_result包含一个带有子代的有效DerivedFromTree。但是,如果我在原始应用程序中放入相同的代码,则在调用bf.Serialize时会出现异常:

{System.Runtime.Serialization.SerializationException: Type 'MyAssembly.Tree`1[[UnderlyingTreeType, Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' from assembly 'Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
   in System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
   in System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
   in System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
   in System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   in System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   in System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
   in Class.Function() in C:\...\FileName.cs:line XXX}

有关可能发生的事情的任何想法吗?

更新:类Tree,DerivedFromTree,UnderlyingTreeType及其所有依赖项都标记为[Serializable]。如果不这样做会导致小型控制台项目抛出异常。如果我从Tree类中删除[Serializable]属性,控制台项目将抛出与原始应用程序完全相同的错误。

4 个答案:

答案 0 :(得分:1)

也许您的对象有委托字段may or may not在序列化时会抛出异常。
确保将委托标记为非可序列化:

[Serializable]
public class MyClass
{   
   [NonSerialized]   
   EventHandler m_MyEvent; 
}

对于事件,您应在应用field时指定NonSerialized属性限定符:

[Serializable]
public class MyPublisher
{
   [field:NonSerialized]   
   public event EventHandler MyEvent; 
}

答案 1 :(得分:1)

不要忘记SerializibleAttributeIsInherited属性设置为false。如果您的代码看起来与上面发布的内容完全相同(没有按DerivedFromTree装饰[Serializible]),那么它将无效...

答案 2 :(得分:0)

要求您浏览

部分
  1. 序列化过程中的步骤

  2. 序列化指南

  3. 文章对象序列化

    http://msdn.microsoft.com/en-us/library/ms973893.aspx

    并检查您是否遗漏了任何内容

答案 3 :(得分:0)

现在问题已解决。我删除了对包含Tree类的DLL的引用并再次添加它,突然一切正常。

我想我会删除这个问题,因为它看起来不太有用......

谢谢大家的帮助。