在我正在开发的应用程序中,我在序列化自定义类时发现了一个问题。它是一个派生自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]属性,控制台项目将抛出与原始应用程序完全相同的错误。
答案 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)
不要忘记SerializibleAttribute
将IsInherited
属性设置为false
。如果您的代码看起来与上面发布的内容完全相同(没有按DerivedFromTree
装饰[Serializible]
),那么它将无效...
答案 2 :(得分:0)
要求您浏览
部分序列化过程中的步骤
序列化指南
文章对象序列化
http://msdn.microsoft.com/en-us/library/ms973893.aspx
并检查您是否遗漏了任何内容
答案 3 :(得分:0)
现在问题已解决。我删除了对包含Tree类的DLL的引用并再次添加它,突然一切正常。
我想我会删除这个问题,因为它看起来不太有用......
谢谢大家的帮助。