序列化继承:如果基类没有标记[Serializable]会抛出异常吗?

Posted

技术标签:

【中文标题】序列化继承:如果基类没有标记[Serializable]会抛出异常吗?【英文标题】:Serialization inheritance: Will an exception be thrown if the base class isn't marked [Serializable]? 【发布时间】:2011-09-16 00:07:36 【问题描述】:

参加模拟考试,考试说我做错了。黄色标记的答案是假定的正确答案。

在下面的引用中,我认为粗体标记的部分是错误的:“Serializable 属性不被派生类继承,所以如果你只用 Serializable 属性标记 Encyclopedia 类,运行时会抛出尝试序列化名称字段时出现异常”。

我实际上创建了一个示例项目,其中包含一个Animal 类和一个派生自它的Cat 类。我标记了Cat[Serializable]Animal 类没有。

我能够成功序列化和反序列化 Cat 类,包括 Animal 属性。

这是 .NET 版本的问题吗?考试是 70-536,所以它的目标是 2.0。

【问题讨论】:

【参考方案1】:

是的,基类也需要可序列化。一些简单的测试代码:

  public class Animal
    
        public Animal()
        
            name = "Test";
        
        public string name  get; set; 
    

    [Serializable]
    public class Cat : Animal
    
        public string color get; set;
    


        var acat = new Cat();
        acat.color = "Green";
        Stream stream = File.Open("test.bin", FileMode.Create);
        BinaryFormatter bformatter = new BinaryFormatter();

        bformatter.Serialize(stream, acat);
        stream.Close();

当你尝试序列化时,你会得到这个错误:

程序集“SerializeTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“SerializeTest.Animal”未标记为可序列化。

编辑 - 我注意到你做了同样的事情,但它对你有用。你有你使用的代码吗?这个在 .net 4 中,但我认为它在版本之间没有太大变化。

【讨论】:

嗯...好的,所以我的测试成功的原因可能是我正在实现自定义序列化。现在回想起来,我想这就是原因。但是,如果您使用默认的序列化方式进行操作,则会出现异常。谢谢! 哦,是的。自定义序列化(甚至其他一些内置序列化程序)忽略 [Serializable] 属性。他们可能会让这个问题更清楚一点。 :) 这就是这些测试题的问题所在。它们大多是技巧问题,而不是你知道多少。

以上是关于序列化继承:如果基类没有标记[Serializable]会抛出异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

面向对向之继承和扫描顺序

基类和继承类的 XML 序列化信息

对象序列化

在同一个向量中存储两个不同的类(具有相同的继承基类)? (没有提升)

ProtoInclude 添加不需要的依赖项

如何在没有直接继承的情况下访问基类容器中的派生对象