不使用默认构造函数的设计
本文关键字:构造函数 默认 | 更新日期: 2023-09-27 18:30:48
我想限制使用默认构造函数创建对象。因为我有一个像下面这样的设计:
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
参数,但默认构造函数正在破坏我的设计......
我该怎么办?
创建私有默认构造函数
private DerivedClass()
{
// code
}
序列化程序将成功调用它,即使它是私有的
反
序列化实例的类需要一个无参数构造函数来创建实例,但您不必实现公共构造函数 - 只要不需要参数,就internal
private
足够了。
顺便说一下,你也可以使用DataContractSerializer,它不需要无参数构造函数,也可以创建XML;它始终是我的主要选择:-)
-
您是否尝试过创建私有无参数构造函数?
-
如果需要公共的,您可以随时评论说不应该使用它(不是最好的解决方案)
还需要在可序列化类中创建属性。 在序列化/取消实现过程中不考虑变量,也不会读取或写入变量