我将包含名为Model
的属性的类序列化为IModel
但是当我尝试反序列化它时,我得到以下异常:
System.Runtime.Serialization.SerializationException: Type 'MYN.IModel' in Assembly 'MYN.Defs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
这是二进制序列化。 Model
标记为可序列化。显然,IModel不是。
那么解决方案是什么,我做错了什么?为什么它试图对接口进行seriliaze或反序列化呢?
P.S。界面中没有Enum。
答案 0 :(得分:5)
获取该错误是有意义的,因为IModel
属性可以引用不同的类,并且不能保证它们都是Serializable。 击>
好的,我试一试,我们有一个:
interface IFoo { }
[Serializable]
class CFoo : IFoo { }
[Serializable]
class Bar
{
public IFoo Foo { get; set; }
}
和Bar序列化和反序列化很好。
Bar b = new Bar();
b.Foo = new CFoo();
using (var s = new System.IO.MemoryStream())
{
var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(s, b);
s.Position = 0;
b = (Bar)bf.Deserialize(s);
Console.WriteLine("OK");
}
那么,与您的IModel
和Model
有什么不同?
答案 1 :(得分:3)
我怀疑这是因为在反序列化期间它启动了一个新的类实例,然后将数据复制到其中。它不能新建接口,因此无法完成反序列化。这就是为什么你需要一个不带序列化参数的构造函数。
在解决方案上不确定,我从来没有这么做过。我可能会覆盖该类并使用具体类型继承该属性,然后将其序列化。
答案 2 :(得分:0)
您可能需要在类中隐式显示这些属性:
而不是IModel.Model
财产
添加
public MyClass Model
答案 3 :(得分:0)
我很确定你不能序列化/反序列化接口,只能是类的实例。我找不到任何文件证实这一点,但我记得试图做同样的事情而没有任何成功。
您可以尝试使用抽象基类而不是接口,但我没有尝试过。