繁体   English   中英

C#继承XmlSerializer

[英]C# inheritance XmlSerializer

greetngs,

我有两节课:

[Serializable]
public class FireGridUnit
{
    public GridUnit FireGridLocation { get; set; }

}

[Serializable]
public class FireResult: FireGridUnit
{
    public bool Hit { get; set; }

    public bool ShipDestroyed { get; set; }

    public Ship.ValidShips DestroyedShipType {get; set;}

    public bool Win { get; set; }
}

如您所见,FireResult继承了FireGrdUnit。

在我的代码中,当我尝试使用它们时,出现运行时错误:

无法将类型为“ NietzscheBattleships.FireGridUnit”的对象强制转换为类型为“ NietzscheBattleships.FireResult”。

这是因为如果我要序列化该类必须是独立的,即不能被继承?

非常感谢。

编辑:

它发生在这里:

                    XmlSerializer ss;
                    StringWriter ww;

                    ss = new XmlSerializer(typeof(FireResult));
                    ww = new StringWriter();

                    ss.Serialize(ww, fireGridUnit);

                    MessageBox.Show("hello");

                    MessageBox.Show(ww.ToString());

它给出了提到的错误。 如果我把它取出来,它就会运行,但显然没有按照它想要的去做。

编辑:我明白了我的错误!

ss.Serialize(ww, fireGridUnit); should be ss.Serialize(ww, fireResult);

谢谢。

[Serializable]在这里什么也不做( XmlSerializer不在乎); 假设真正的问题出在序列化API(而不仅仅是演员)中,则:

[XmlInclude(typeof(FireResult))]
public class FireGridUnit {...}

然后使用它,就像:

        XmlSerializer ser = new XmlSerializer(typeof(FireGridUnit));
        using (MemoryStream ms = new MemoryStream())
        {
            ser.Serialize(ms, new FireResult { Hit = true });
            ms.Position = 0;
            FireGridUnit fr = (FireGridUnit)ser.Deserialize(ms);
            Debug.WriteLine(fr is FireResult); // true
        }

不,与[Serializable]无关。 多态性的工作方式则相反。 您只能通过层次结构上(ParentClass)childObject;(ParentClass)childObject; ),而不能下(ChildClass)parentObject(ChildClass)parentObject )。

例如:

//This is correct
FireResult result = new FireResult();
FireGridUnit unit = result;

//This just does not seem right
FireGridUnit unit = new FireGridUnit();
FireResult result = unit;

编辑:通过以下方式考虑继承。 所有FireResults都是FireGridUnit,因此,您可以将FireResults转换为FireGridUnits。 但是,并非所有FireGridUnit都是FireResult,因为您可能拥有从FireGridUnit继承的第三个类。 因此,您不能将所有FireGridUnits转换为FireResult。

不,您不能将FireGridUnit转换为FireResult。 另一种方法很好。 您序列化了错误的对象,或者在Deserialize()的返回值上使用的强制转换是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM