如何反序列化接口类型?

时间:2009-10-20 09:22:18

标签: c# .net serialization interface

我将包含名为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。

4 个答案:

答案 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");
}

那么,与您的IModelModel有什么不同?

答案 1 :(得分:3)

我怀疑这是因为在反序列化期间它启动了一个新的类实例,然后将数据复制到其中。它不能新建接口,因此无法完成反序列化。这就是为什么你需要一个不带序列化参数的构造函数。

在解决方案上不确定,我从来没有这么做过。我可能会覆盖该类并使用具体类型继承该属性,然后将其序列化。

答案 2 :(得分:0)

您可能需要在类中隐式显示这些属性:

而不是 IModel.Model财产 添加

public MyClass Model

答案 3 :(得分:0)

我很确定你不能序列化/反序列化接口,只能是类的实例。我找不到任何文件证实这一点,但我记得试图做同样的事情而没有任何成功。

您可以尝试使用抽象基类而不是接口,但我没有尝试过。