C# XML 反序列化器未正确构造对象
C# XML Deserializer not constructing object properly
我的 class 看起来像这样:
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?
您可以简单地为 C 修改 getter,例如:
public int C { get { return this.A + this.B; }}
反序列化只会填充变量 - 实例化对象所需的任何其他逻辑都需要由程序 运行 执行,而不是反序列化程序。尝试这样的事情:
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)
}
}
编辑:如果需要在执行逻辑之前设置变量,您可以创建 class 的空白实例,然后使用将 XML 作为一个输入。有关示例,请参见以下答案:When is the class constructor called while deserialising using XmlSerializer.Deserialize?
如果您使用的是常规二进制格式化程序,则:
[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
的答案,但是需要继承默认的
How do you find out when you've been loaded via XML Serialization?
我的 class 看起来像这样:
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?
您可以简单地为 C 修改 getter,例如:
public int C { get { return this.A + this.B; }}
反序列化只会填充变量 - 实例化对象所需的任何其他逻辑都需要由程序 运行 执行,而不是反序列化程序。尝试这样的事情:
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)
}
}
编辑:如果需要在执行逻辑之前设置变量,您可以创建 class 的空白实例,然后使用将 XML 作为一个输入。有关示例,请参见以下答案:When is the class constructor called while deserialising using XmlSerializer.Deserialize?
如果您使用的是常规二进制格式化程序,则:
[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
的答案,但是需要继承默认的
How do you find out when you've been loaded via XML Serialization?