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?