Design without default constructor

2020-03-02 05:10发布

I want to restrict creating object using default constructor. Because I have a desing like below:

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)
    {
    }
}

This is ok. But when I make BaseClass to Serializable it'll generate this error: Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

Now my design is collapsing because I need to have Username, Password parameters but default constructor is ruining my design....

What should I do?

3条回答
叼着烟拽天下
2楼-- · 2020-03-02 05:38

The class deserializing your instances requires a parameterless constructor to create the instance, but you don't have to implement a public constructor -- it's enough to have a private or internal constructor as long as it needs no parameters.

By the way, you can as well use the DataContractSerializer, which does not require a parameterless constructor and creates XML, too; it's always my primary choice :-)

查看更多
贼婆χ
3楼-- · 2020-03-02 05:48

Create a private default constructor

private DerivedClass()
{
    // code
}

The serialzer will successfully call this even though it's private

查看更多
Viruses.
4楼-- · 2020-03-02 05:51
  • Have you tried to create a private parameterless constructor?

  • If there is the need of a public one, you can always comment saying that it should not be used (not the best solution)

You also need to create properties in your Serializable class. Variables are not considered and will not be read or written during serialization/deserealization process

查看更多
登录 后发表回答