Я делаю приложение для гостиницы в качестве школьного проекта, и мне кажется, что это не работает. У меня есть абстрактный класс Arrangementen и 3 производных класса.
FamilieArrangementen: StandaardArrangementen StandaardArrangementen: Arrangementen LuxeArrangementen: Arrangementen
Каждый раз, когда я десериализую XML-файл, я получаю исключение System.InvalidOperationException ‹StandaardArrangement xmlns =" /> не ожидалось.
Я искал в Интернете ответ и полагаю, что это что-то с пространством имен XmlRoot или XmlInclude работает неправильно
Какие-либо предложения?
Это мой код
абстрактный класс Arrangementen
namespace HotelLib.Overkoepelend.Arrangementen
{
[Serializable()]
[XmlInclude(typeof(FamilieArrangement))]
[XmlInclude(typeof(StandaardArrangement))]
[XmlInclude(typeof(LuxeArrangement))]
public abstract class Arrangement: ICloneable
{
...
}
}
class FamilieArrangement
namespace HotelLib.Overkoepelend.Arrangementen
{
[Serializable]
public class FamilieArrangement : StandaardArrangement
{
...
}
}
класс StandaardArrangement
namespace HotelLib.Overkoepelend.Arrangementen
{
[Serializable]
public class StandaardArrangement : Arrangement
{
...
}
}
класс LuxeArrangement
namespace HotelLib.Overkoepelend.Arrangementen
{
[Serializable]
public class LuxeArrangement : Arrangement
{
...
}
}
Код сериализации
internal void WriteArrangement(Arrangement ar, string path)
{
using (FileStream bestand = File.Open(path, FileMode.OpenOrCreate))
{
XmlSerializer xmls = new XmlSerializer(ar.GetType());
xmls.Serialize(bestand, ar);
}
}
Код десериализации
internal Arrangement ReadArrangement(string path)
{
if (File.Exists(path))
{
using (FileStream bestand = File.Open(path, FileMode.OpenOrCreate))
{
try
{
xmls = new XmlSerializer(typeof(Arrangement));
Arrangement ar = (Arrangement) xmls.Deserialize(bestand);
bestand.Close();
return ar;
}
catch (Exception er)
{
MessageBox.Show("" + er.GetBaseException());
}
bestand.Close();
}
}
return null;
}
другая попытка (которая не сработала, но дала еще одну ошибку
internal Arrangement ReadArrangement(string pad)
{
if (File.Exists(pad))
{
using (FileStream bestand = File.Open(pad, FileMode.OpenOrCreate))
{
try
{
xmls = new XmlSerializer(typeof(Arrangement));
Arrangement ar = (Arrangement) xmls.Deserialize(bestand);
bestand.Close();
return ar;
}
catch (Exception )
{
try
{
xmls = new XmlSerializer(typeof(FamilieArrangement));
FamilieArrangement ar = (FamilieArrangement)xmls.Deserialize(bestand);
bestand.Close();
return ar;
}
catch (Exception)
{
try
{
xmls = new XmlSerializer(typeof(StandaardArrangement));
StandaardArrangement ar = (StandaardArrangement)xmls.Deserialize(bestand);
bestand.Close();
return ar;
}
catch (Exception er)
{
MessageBox.Show("" + er.GetBaseException());
}
}
}
bestand.Close();
}
}
return null;
}
файл Xml со StandaardArrangement
<?xml version="1.0"?>
<StandaardArrangement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AantalVolw xmlns="HotelLib.Overkoepelend.Arrangementen">2</AantalVolw>
<Kamer xmlns="HotelLib.Overkoepelend.Arrangementen">
<MaxAantal>4</MaxAantal>
<Bezetting>
<Tijdslot>
<Aankomst>2013-12-28T10:18:21.4384129+01:00</Aankomst>
<Vertrek>2013-12-31T10:18:21</Vertrek>
</Tijdslot>
</Bezetting>
</Kamer>
<KlantId xmlns="HotelLib.Overkoepelend.Arrangementen">d4d72906-7b04-46aa-9986-4f22b232fbd0</KlantId>
<Tijdslot xmlns="HotelLib.Overkoepelend.Arrangementen">
<Aankomst>2013-12-28T15:09:10.1152899+01:00</Aankomst>
<Vertrek>2013-12-30T15:09:10.1152899+01:00</Vertrek>
</Tijdslot>
<Type xmlns="HotelLib.Overkoepelend.Arrangementen">standaard</Type>
<MaaltijdType>halfpension</MaaltijdType>
<Opties>
<KamerOpties>kluis</KamerOpties>
<KamerOpties>wifi</KamerOpties>
</Opties>
</StandaardArrangement>
[Serializable]
не применяется к сериализации XML. - person Ondrej Tucny   schedule 28.12.2013