C# XML 反序列化程序未正确构造对象
本文关键字:对象 XML 反序列化 程序 | 更新日期: 2023-09-27 17:56:56
我的类看起来像这样:
public class MyClass
{
private void MyClass() { } //just to satisfy the XML serializer
public void MyClass(int a, int b)
{
A = a;
B = b;
C = a + b;
}
public int A { get; set; }
public int B { get; set; }
public int C { get; private set; } //private set is only to
//satisfy the XML Serializer
public void DoSomeMath()
{
Console.WriteLine("{0} + {1} = {2}'n", A, B, C)
}
}
当我使用 a &b 参数实例化我自己的 myClass 对象时,这工作正常,但反序列化器只会调用无参数构造函数。 如何在不创建另一个方法并在反序列化后调用它的情况下初始化 C?
反序列化只会填充变量 - 实例化对象所需的任何其他逻辑都需要由程序运行,而不是由反序列化程序运行。尝试这样的事情:
public class MyClass
{
private void MyClass() // NOT just to satisfy the XML serializer
{
GetStuffReady();
}
public void MyClass(int a, int b)
{
A = a;
B = b;
GetStuffReady();
}
public int A { get; set; }
public int B { get; set; }
public int C { get; private set; }
public void GetStuffReady()
{
C = A + B;
}
public void DoSomeMath()
{
Console.WriteLine("{0} + {1} = {2}'n", A, B, C)
}
}
或者更好的是:
public class MyClass
{
private void MyClass() { } //just to satisfy the XML serializer
public void MyClass(int a, int b)
{
A = a;
B = b;
}
public int A { get; set; }
public int B { get; set; }
public int C
{
get
{
return A + B;
}
set { }
}
public void DoSomeMath()
{
Console.WriteLine("{0} + {1} = {2}'n", A, B, C)
}
}
编辑:如果需要在执行逻辑之前设置变量,则可以创建类的空白实例,然后使用将 XML 作为输入的帮助程序方法设置变量。 有关示例,请参阅以下答案:在使用 XmlSerializer 反序列化时何时调用类构造函数。反序列化?
您可以简单地修改 C 的 getter,如下所示:
public int C { get { return this.A + this.B; }}
如果您使用的是常规二进制格式化程序,则:
[OnDeserialized]
public void DoSomeMath()
{
Console.WriteLine("{0} + {1} = {2}'n", A, B, C)
}
对于XmlSerializer
,不支持事件。你可以实现IXmlSerializable
,但这并不平凡。
对于DataContractSerializer
(序列化为 xml),您可以尝试:
[OnDeserializing]
public void OnDeserializing(StreamingContext context)
{
... // logic here.
}
这里有一个答案可以XmlSerializer
但它需要继承默认答案。
您如何知道何时通过 XML 序列化加载?