将基类转换为ISerializable

时间:2012-11-22 07:09:26

标签: c# .net serialization

我在子类和父类中都实现了ISerializable,如下所示:

class CircuitElement : ISerializable
{
    ...
    protected void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");
        info.AddValue("ID", ID);
    }
}

class Bus : CircuitElement, ISerializable
{
    ...
    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");
        ((ISerializable)base).GetObjectData(info,context);
        info.AddValue("Voltage", Voltage);
        info.AddValue("BaseVoltage", BaseVoltage);
        info.AddValue("Location", Location);
    }
}

但在子课程Bus中,我收到错误Use of keyword base is not valid in this context。我知道我可以隐式地在父CircuitElement类上实现接口,然后我不必担心转换,但是认为显式实现更适合这种情况(原因类似)对于这里介绍的人:https://stackoverflow.com/a/143425/996592

有没有办法进行转换,还是我无法隐式地在父类中实现ISerializable接口?

2 个答案:

答案 0 :(得分:2)

就个人而言,我不同意您所关注答案中提出的观点。显式接口实现只是更有问题,因为完全你给出的原因:它实际上不能很好地继承。

如果您正在重新实现已明确实现的接口,那么只有无法在类型的对象上调用该实现,该对象重新实现相同的接口,包括来自该代码的代码重新实现。

两个选项:

  • 改为使用隐式接口实现。就个人而言,我通常觉得这个更简单。我只使用显式接口实现,当接口具有在您考虑类本身时没有意义的成员时。

  • 继续使用显式接口实现,但要使该实现只是调用受保护的虚方法。然后,您可以在派生类中覆盖该虚方法,并调用基本实现。

答案 1 :(得分:1)

您不需要使用"base"关键字进行转换。实际上,您无法在此上下文中使用"base"关键字。如果您希望使用"base.GetObjectData" 包含父信息,如果您以隐式方式实现"ISerializable"接口,则应该调用基本方法,并且它将与所有者一起调用父方法调用者实例。

这种行为是面向对象模型中的一个简单的事情,你无法改变它。另一方面,您可以使用"virtual"关键字并尝试覆盖父方法(在这种情况下,我不认为您需要此方法)。

我认为你应该看一下stackoverflow上的here,关于实现接口的方法有一些很好的答案。

在MSDN here上还有一本关于多态性的完美手册。它将帮助您理解为什么您可以转换"base",并且您会发现一些技术可以用其他指定的方式来完成。

我的想法:

使用"dynamic"关键字和"ExpandoObject"更适合创建动态模型并对其进行序列化处理。我个人认为,在许多情况下它的速度要快得多,而且实施起来也很简单。

希望有所帮助。