用于XML序列化的C#null基类构造函数...派生类无法调用?

时间:2018-01-28 11:30:14

标签: c# xml-serialization

不确定这里是否需要代码示例,但这里有。

在基类中我有:

public class BaseClass
{
    public BaseClass()
    {
        // empty constructor for XML serialisation
    }

    public BaseClass(<some parameters>)
    {
        // initialise correctly
        [...]
    }

    // force base classes to implement Xml serialisation
    protected abstract XmlDocument AsXmlDocument();

}

然后派生类有

public class DerivedClass : BaseClass
{
    public DerivedClass() : base()
    {
        // null constructor
    }

    public override XmlDocument AsXmlDocument()
    {
        // serialization code
        [...]
    }
}

我想创建null构造函数private,所以没有别的可以调用它。这样就可以通过非null构造函数正确初始化类。意思是,我希望它们初始化,以便有序列化的东西。保留空构造函数protectedinternalpublic意味着我将失去此保证。

但是如果我创建基类null构造函数private,那么我不能在派生类中使用null构造函数,因为基类null构造函数是不可访问的。即使我从派生类'null构造函数中删除“: base()”,我也会收到这些错误。代码无法编译所以我必须接受一个非private null构造函数,即使我不想要一个;它将风险引入我的代码库中。

通过[Serializable]或每个派生类中的接口ISerializable对序列化进行编码似乎是浪费,低效和冒险的。似乎不必要的劳动与代码重用和继承相悖。

可能我在这里遗漏了一些关于序列化的明显或基本的东西。但到目前为止还没有找到答案。

后续注释

我想确保派生类被强制调用非null构造函数。我正在处理的项目中有数百个派生类,其中没有显式传递给基类非null构造函数。

所以我在哪里

public DerivedClass(<some parameters>)
{
    [...]
}

这被编译为

public DerivedClass(<some parameters>) : base()
{
    [...]
}

但我希望将其作为编译时错误抛出。

我想强制推导显式,或者抛出编译器错误:

public DerivedClass(<some parameters>) : base(<some parameters>)
{
    [...]
}

似乎需要为构造函数提供一个新的访问修饰符。

热烈欢迎任何建议......

1 个答案:

答案 0 :(得分:0)

您应该明确地看一下受保护的修饰符。

如果您创建受保护的构造函数,则只能通过继承类来调用构造函数,并且:base()将再次运行。