Проектирование без конструктора по умолчанию


Я хочу ограничить создание объекта с помощью конструктора по умолчанию. Потому что у меня есть десинг, как показано ниже:

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 7

3 ответа:

Создайте частный конструктор по умолчанию

private DerivedClass()
{
    // code
}

Сериализатор успешно вызовет это, даже если это частное

Класс, десериализующий ваши экземпляры, требует для создания экземпляра конструктора без параметров, но вам не нужно реализовывать открытый конструктор-достаточно иметь конструктор private или internal, если ему не нужны параметры.

Кстати, вы также можете использовать DataContractSerializer, который не требует конструктора без параметров и тоже создает XML; это всегда мой основной выбор : -)

  • Вы пробовали создать частный конструктор без параметров?

  • Если есть необходимость в публичном, вы всегда можете прокомментировать, сказав, что его не следует использовать (не лучшее решение)

Также необходимо создать свойства в Сериализуемом классе. Переменные не рассматриваются и не будут считываться или записываться во время процесса сериализации/десереализации