Serializacja w C# to nie tylko dodanie atrybutu Serializable.
Serializacja do postaci binarnej czyli:
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(str, dto);
Przyjmie prawie wszystko, co jej dostarczymy.
Jednak serializacja do XML za pomocą:
XmlSerializer x = new XmlSerializer(dto.GetType());
x.Serialize(str, dto);
Już nie.
1) XmlSerializer nie trawi interfejsów.
Co w tej sytuacji zrobić, jeżeli w klasie do serializacji jest właściwość będąca interfejsem? Trzeba wstawić między interfejs a klasy dziedziczące klasę abstrakcyjną, serializowalną i dodać “czystą” implementację tej klasy, aby serializer wiedział czym w razie czego się uczepić:
[XmlInclude(typeof(ImplementedWorker))] Szczegóły tutaj. Cytując:
public interface IWorker { string WorkerName { get; set; } } [Serializable] [XmlInclude(typeof(ImplementedWorker))] public abstract class WorkerBase : IWorker { public abstract string WorkerName { get; set; } } [Serializable] public class ImplementedWorker : WorkerBase { #region IWorker Members public override string WorkerName { get; set; } #endregion } [Serializable] public class WorkToDo { public WorkerBase Worker; }
2) Dictionary nie jest serializowane przez XmlSerializer
Szczegóły na blogu Paula Weltera.
Wybaczcie ale nie będę cytował, ale sami znajdziecie nawet jakby kiedyś tego bloga nie było.
Nazwa klasy to SerializableDictionary.
