代码之家  ›  专栏  ›  技术社区  ›  dr. evil

如何反序列化接口类型?

  •  5
  • dr. evil  · 技术社区  · 16 年前

    我序列化一个类,该类包含一个名为 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.接口中没有枚举。

    4 回复  |  直到 9 年前
        1
  •  5
  •   Henk Holterman    9 年前

    得到那个错误是有意义的,因为 IModel 属性可以引用不同的类,不能保证它们都是可序列化的。


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

    测试用例错误,它在我的计算机上工作。


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

    所以,和你的有什么不同 伊莫德尔 Model ?

        2
  •  3
  •   user1333    16 年前

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

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

        3
  •  0
  •   Vitaliy Liptchinsky    16 年前

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

    而不是 IModel.Model 财产 添加

    public MyClass Model
    
        4
  •  0
  •   Andy Johnson    16 年前

    我相当肯定您不能序列化/反序列化接口,只能是类的实例。我找不到任何文件来证实这一点,但我记得我曾试图在没有任何成功的情况下做同样的事情。

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

    推荐文章