Χρησιμοποιήστε το χαρακτηριστικό XmlInclude ή SoapInclude για να καθορίσετε τύπους που δεν είναι γνωστοί στατικά

Χρησιμοποιήστε το χαρακτηριστικό XmlInclude ή SoapInclude για να καθορίσετε τύπους που δεν είναι γνωστοί στατικά

Αυτό λειτούργησε για μένα:

[XmlInclude(typeof(BankPayment))]
[Serializable]
public abstract class Payment { }    

[Serializable]
public class BankPayment : Payment {} 

[Serializable]
public class Payments : List<Payment>{}

XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});

Μόλις έλυσε το θέμα. Αφού έψαξα για λίγο ακόμα, βρήκα αυτό το SO post που καλύπτει την ίδια ακριβώς κατάσταση. Με οδήγησε στο σωστό δρόμο.

Βασικά, το XmlSerializer πρέπει να γνωρίζει τον προεπιλεγμένο χώρο ονομάτων if Οι παράγωγες κλάσεις περιλαμβάνονται ως επιπλέον τύποι. Ο ακριβής λόγος για τον οποίο πρέπει να συμβεί αυτό είναι ακόμα άγνωστος, αλλά, ακόμα, η σειριοποίηση λειτουργεί τώρα.


Με βάση αυτό μπόρεσα να το λύσω αλλάζοντας τον κατασκευαστή του XmlSerializer Χρησιμοποιούσα αντί να αλλάξω τις τάξεις.

Αντί να χρησιμοποιήσετε κάτι τέτοιο (προτείνεται στις άλλες απαντήσεις):

[XmlInclude(typeof(Derived))]
public class Base {}

public class Derived : Base {}

public void Serialize()
{
    TextWriter writer = new StreamWriter(SchedulePath);
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>));
    xmlSerializer.Serialize(writer, data);
    writer.Close();
}

Έκανα αυτό:

public class Base {}

public class Derived : Base {}

public void Serialize()
{
    TextWriter writer = new StreamWriter(SchedulePath);
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>), new[] { typeof(Derived) });
    xmlSerializer.Serialize(writer, data);
    writer.Close();
}