7

我想限制使用默认构造函数创建对象。因为我有如下设计:

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 设置为 Serializable 时,它​​会产生这个错误: Unhandled Exception: System.InvalidOperationException: ConsoleApplication1.BaseC lass cannot be serialized because it does not have a parameterless constructor.

现在我的设计正在崩溃,因为我需要有Username,Password参数,但默认构造函数正在破坏我的设计......

我该怎么办?

4

3 回答 3

12

创建私有默认构造函数

private DerivedClass()
{
    // code
}

即使它是私有的,序列化程序也会成功调用它

于 2012-04-10T11:58:03.760 回答
11

反序列化您的实例的类需要一个无参数的构造函数来创建实例,但您不必实现公共构造函数——只要它不需要参数,就有一个privateor构造函数就足够了。internal

顺便说一句,您也可以使用DataContractSerializer,它不需要无参数构造函数并且也可以创建 XML;这始终是我的主要选择:-)

于 2012-04-10T11:58:21.440 回答
1
  • 您是否尝试过创建私有无参数构造函数?

  • 如果需要公共的,您可以随时评论说不应该使用它(不是最好的解决方案)

您还需要在 Serializable 类中创建属性。在序列化/反实现过程中不考虑变量,也不会读取或写入变量

于 2012-04-10T12:02:16.647 回答