perché la gente continui a dire "non sarai mai in grado per deserializzare. " Questo è definitivo FALSO.
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"));
Boom. Funziona solo BENE !!!!! La serializzazione funziona perfettamente in tutte e tre le direzioni. gli oggetti risultanti potrebbero non essere al 100% su entrambi i lati, ma deserializza. Ser1 ignora l'elemento di valore quando la deserializzazione ser2.xml Ser2 salta la propertuy valore quando la deserializzazione ser1.xml
L'unica cosa che rompe questo modello è:
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"));
Quest'ultimo pause, becuase il il Serializzatore per BaseClass segue lo standard dello schema (sebbene sia uno standard valido e il 99% del tempo desiderato) di includere l'attributo xsi: type = "ChildClass" sull'elemento. Ser3 non può elaborare quel tipo perché non è realizzato per quel tipo, specialmente se FlatClass esiste in un altro assieme su linee WAN o LAN. Proprio come Honey-badger, XmlSerailizer NON CURA degli elementi o dei valori finché riesce a trovarli e nulla nello schema interrompe il processo. L'attributo XSI: TYPE interrompe lo schema.
Come, ad esempio, quando si utilizza WCF o altri sistemi di comunicazione XML se il Servizio ha una classe chiamata FlatClass, NON DESERIALIZZA una ChildClass che contiene l'attributo xsi: type = "". Tuttavia, se non si utilizza il serializzatore per BaseClass, verrà deserializzato esattamente lo stesso XML senza quell'attributo xsi: type.
Q.E.D. Spesso è utile, necessario e DISPONIBILE, per NON includere l'attributo xsi: type.
Quindi con ciò detto c'è un modo per avere un XmlSerializer creato per il tipo BaseClass e dirgli di NON includere l'attributo xsi: type durante la serializzazione di un tipo figlio?
Grazie Jaeden "Sifo Dyas" al'Raec Ruiner
Potete fornire il codice della classe che si desidera serializzare? – Seb