C # наследование XmlSerializer - PullRequest
       22

C # наследование XmlSerializer

2 голосов
/ 22 марта 2010

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.

это потому, что если я сериализую, класс должен быть независимым, то есть не наследоваться?

большое спасибо.

EDIT:

это происходит здесь:

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

спасибо.

Ответы [ 3 ]

4 голосов
/ 22 марта 2010

[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
        }
2 голосов
/ 22 марта 2010

Нет, это не имеет ничего общего с [Serializable].Способ полиморфизма работает наоборот.Вы можете только повышать ((ParentClass)childObject;) через иерархию, но не понижать ((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 являются FireGridUnits, поэтому вы можете преобразовать FireResults в FireGridUnits.Однако не все FireGridUnits являются FireResult, потому что у вас может быть третий класс, который наследуется от FireGridUnit.Таким образом, вы не можете конвертировать ВСЕ FireGridUnits в FireResult.

1 голос
/ 22 марта 2010

Нет, вы не можете преобразовать FireGridUnit в FireResult.С другой стороны это нормально.Либо вы сериализовали неправильный объект, либо приведение, которое вы использовали для возвращаемого значения Deserialize (), неверно.

...