假设我有商务舱:
public class Foo
{
public int Prop1 {get;set;}
public int Prop2 {get;set;}
public Foo(int prop1, int prop2)
{
this.Prop1 = prop1;
this.Prop2 = prop2;
}
public Foo()
{
throw new NotImplementedException();
}
}
只有在设置了两个属性时,业务类才有效。因此,我可以确保实现无参数构造函数,并在有人尝试使用无参数构造函数实例化类时抛出NotImplementedException。
但现在我希望能够序列化/反序列化我的课程。对于deserilization过程,我需要默认的构造函数,它不再抛出NotImplementedExeption。
有没有办法找出是否使用默认构造函数创建了我的类的实例,或者是否正在反序列化该对象?
假设我没有两个属性的有效默认值。
我怎样才能解决这种情况?
答案 0 :(得分:0)
使用protected modifier隐藏默认构造函数。
答案 1 :(得分:0)
二进制反序列化不会调用任何构造函数,AFAIK。
答案 2 :(得分:0)
如果你实现了ISerializable
,那么你将通过你需要使用的构造函数来进行反序列化。
如果您实现IXmlSerializable
并且序列化是通过XmlSerialization进行的,那么您将通过该接口定义的ReadXml
方法进行反序列化。
如果您实施IDeserializationCallback
,那么在构建对象之后,您将实现名为的OnDeserialization
。这对你的目的来说可能为时已晚,但如果足够的话,那么它可能最容易添加到已经存在的类中。