Поскольку объект, который может быть сериализован в XML, нуждается в общедоступном конструкторе без параметров, кажется, что у вас есть дыра в дизайне класса даже до того, как вы нажмете сериализацию XML.
Лично я бы пошел с ленивым подсчетом этих полей. Сохраните флаг внутри класса независимо от того, рассчитали ли вы поля или нет, и установите для этого поля значение, означающее «устарело», когда изменяется любое из свойств, используемых в вычислении. Затем в свойствах, которые возвращают вычисленные значения, проверьте, нужно ли пересчитать перед возвратом значения.
Это будет работать независимо от сериализации XML или нет.
пример:
[XmlType("test")]
public class TestClass
{
private int _A;
private int? _B;
public TestClass()
: this(0)
{
}
public TestClass(int a)
{
_A = a;
}
[XmlAttribute("a")]
public int A
{
get { return _A; }
set { _A = value; _B = null; }
}
[XmlIgnore]
public int B
{
get { if (_B == null) Recalculate(); return _B; }
set { _B = value; }
}
private void Recalculate()
{
_B = _A + 1;
}
}