C# 如何反序列化接口类型?

C# 如何反序列化接口类型?,c#,.net,serialization,interface,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
,但当我尝试对其进行反序列化时,出现以下异常:

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.
这是二进制序列化<代码>型号标记为可序列化。显然,伊莫代尔不是

那么解决方案是什么,我做错了什么?为什么它要尝试序列化或反序列化接口呢


p.S.接口中没有枚举。

可能需要在类中隐式公开这些属性:

而不是
IModel.Model
属性 加

获取该错误是有意义的,因为
IModel
属性可以引用不同的类,并且不能保证它们都是可序列化的


好的,我试了一下,我们有一个:

Testcase错误,它在我的计算机上工作。
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
有什么不同呢?

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


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

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


我不确定解决方案,我从来没有解决过这个问题。我可能会重写该类并用具体类型继承属性,然后将其序列化。

它知道将接口反序列化为哪种类型吗?在可序列化的类中是否有IModel类型的属性?我想是的,我应该告诉反序列化器一些关于它的信息吗?@Arsen是的,我知道,这就是我出错的原因(我想)。只是一个猜测,但是如果您将
IModel
标记为可序列化呢?是的,但在我的情况下,我不能这样做,我希望不这样做就能解决这个问题。这意味着接口也需要实现可序列化接口;-),这对我来说非常有意义。当然,我同意这一点,问题是如何解决它?:)虽然我问的问题很糟糕,但我会更改标题。这对二进制序列化没有意义,二进制序列化也会序列化具体类型,因此如果和IModel指向模型对象,序列化类型信息将包含足够的信息来反序列化模型对象。+1感谢您的澄清,这改变了一切:)我将尝试找出你和我的示例的不同之处。我正在尝试序列化一个实例,而不是接口本身。它是一种实现此接口并在Serialized类中引用的类型。Ok。我说得不够精确。我的意思是“不能使用对对象实现的接口的引用来序列化/反序列化对象”。我开始认为我遇到的问题和你遇到的问题不一样。问题:你说你的类有一个叫做Model的属性。稍后您会说“标记为可序列化的模型”。您指的是名为Model的类还是名为Model的属性?实现IModel的类是否都属性化为[Serializable]?
interface IFoo { }

[Serializable]
class CFoo : IFoo   { }

[Serializable]
class Bar
{
    public IFoo Foo { get; set; }
}
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");
}