Проектирование без конструктора по умолчанию
Я хочу ограничить создание объекта с помощью конструктора по умолчанию. Потому что у меня есть десинг, как показано ниже:
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass("","");
XmlSerializer xml = new XmlSerializer(typeof(BaseClass));
StreamWriter sw = new StreamWriter(File.Create("c:\test.txt"));
xml.Serialize(sw,bc);
sw.Flush();
sw.Close();
}
}
[Serializable]
public class BaseClass
{
public string UserName, Password;
// I don't want to create default constructor because of Authentication
public BaseClass(string _UserName, string _Password)
{
UserName = _UserName;
Password = _Password;
f_Authenticate();
}
private void f_Authenticate() { }
}
public class DerivedClass:BaseClass
{
public DerivedClass(string _UserName, string _Password) : base(_UserName, _Password)
{
}
}
Это нормально. Но когда я сделаю BaseClass Сериализуемым, он сгенерирует эту ошибку:
Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC
lass cannot be serialized because it does not have a parameterless constructor.
Теперь моя конструкция рушится, потому что мне нужно иметь Username
, Password
параметры, но конструктор по умолчанию разрушает мой дизайн....
Что мне делать?
3 ответа:
Создайте частный конструктор по умолчанию
private DerivedClass() { // code }
Сериализатор успешно вызовет это, даже если это частное
Класс, десериализующий ваши экземпляры, требует для создания экземпляра конструктора без параметров, но вам не нужно реализовывать открытый конструктор-достаточно иметь конструктор
private
илиinternal
, если ему не нужны параметры.Кстати, вы также можете использовать DataContractSerializer, который не требует конструктора без параметров и тоже создает XML; это всегда мой основной выбор : -)
Вы пробовали создать частный конструктор без параметров?
Если есть необходимость в публичном, вы всегда можете прокомментировать, сказав, что его не следует использовать (не лучшее решение)
Также необходимо создать свойства в Сериализуемом классе. Переменные не рассматриваются и не будут считываться или записываться во время процесса сериализации/десереализации