Dlaczego ludzie ciągle mówią „nigdy nie będziesz w stanie deserializować. " To jest w zasadzie FALSE.
public class BaseClass {
public string Name {get;set;}
}
[XmlRoot("BaseClass")]
public class ChildClass : BaseClass {
public int Value {get;set;}
}
[XmlRoot("BaseClass")]
public class FlatClass
{
public string Name {get;set;}
public int Value {get;set;}
}
XmlSerializer ser1 = new XmlSerializer(typeof(BaseClass));
XmlSerializer ser2 = new XmlSerializer(typeof(ChildClass));
XmlSerializer ser3 = new XmlSerializer(typeof(FlatClass));
ser1.Serialize(File.Open("ser1.xml", FileMode.Create), new BaseClass(){Name="Base"});
ser2.Serialize(File.Open("ser2.xml", FileMode.Create), new ChildClass(){Name="Child",Value = 1});
ser1.Deserialize(File.OpenRead("ser2.xml"));
ser2.Deserialize(File.OpenRead("ser1.xml"));
ser3.Deserialize(File.OpenRead("ser2.xml"));
Bum. Działa po prostu DOKŁADNIE !!!!! Serializacja idealnie pasuje do wszystkich trzech trybów. wynikowe obiekty mogą nie być w 100% po obu stronach, ale zmieniają się deserializująco. Ser1 ignoruje elementu Wartość gdy deserializacji ser2.xml Ser2 pomija propertuy wartość podczas deserializacji ser1.xml
Jedyną rzeczą, która łamie ten model jest:
ser1.Serailize(File.Open("ser3.xml", FileMode.Create), new ChildClass(){Name = "Child2", Value = 2});
XmlSerialize ser3 = new XmlSerializer(typeof(FlatClass));
ser3.Deserialize(File.OpenRead("ser3.xml"));
tej ostatniej przerwy, ponieważ posiadał w tym serializer dla BaseClass jest zgodny ze standardem schematu (aczkolwiek wartościowy i 99% czasu trwania standardu), w tym atrybut xsi: type = "ChildClass" na elemencie. Ser3 nie może przetworzyć tego typu, ponieważ nie jest on realizowany dla tego typu, szczególnie jeśli FlatClass istnieje w innym złożeniu w sieci WAN lub LAN. Podobnie jak Honey-Badger XmlSerailizer NIE PAMIĘTAJ o elementach lub wartościach, dopóki może je znaleźć, a nic w schemacie nie przerywa procesu. Atrybut XSI: TYPE przerywa schemat.
Podobnie, na przykład, przy korzystaniu z WCF lub innych systemów opartych na komunikacji XML, jeśli Usługa ma klasę o nazwie FlatClass, NIE BĘDZIE DESERIALIZOWAĆ klasy ChildClass zawierającej atrybut xsi: type = "". Jeśli jednak nie korzystasz z serializera dla BaseClass, będzie deserializował dokładnie ten sam XML bez tego atrybutu xsi: type.
Q.E.D. Często jest to czasy korzystne, konieczne i DESIRABLE, do NOT obejmują atrybut xsi: type.
W związku z tym istnieje sposób na utworzenie XmlSerializer dla typu BaseClass i poinformowanie go, aby nie uwzględniał atrybutu xsi: type podczas serializowania typu potomnego?
Dzięki Jaeden "Sifo Dyas" al'Raec Ruiner
można podać kod klasy chcesz serializacji? – Seb