Способ, которым я подхожу к этой проблеме, заключается в том, что я просто не ставлю под угрозу целостность моих типов для целей сериализации.Процесс сериализации все о данных и очень мало о поведении.Я отказываюсь ставить под угрозу поведение моих типов только для сценария с данными.
Вместо этого я разрабатываю свои типы для наиболее эффективного + безопасного использования.Если результирующий тип не сериализуем и я нахожу сценарий, который требует этого, я создам отдельные типы, которые существуют исключительно для сериализации моих других типов.
Вот краткий пример.
// My Core Immutable Type
namespace MyProject {
public sealed class Student {
private readonly string _name;
public string Name {
get { return _name; }
}
public Student(string name) {
_name = name;
}
}
}
// My Xml Serialization Type
namespace MyProject.Serialization {
public class SerializableStudent {
public string Name;
public SerializableStudent(Student source) {
Name = source.Name;
}
public Student ConvertToStudent() {
return new Student(Name);
}
}
}