Чтобы продвинуться в решении, чтобы десериализация также работала ...
public class A
{
private int _id = -1;
public int Id
{
get { return _id; }
set
{
if (_id < 0)
throw new InvalidOperationException("...");
if (value < 0)
throw new ArgumentException("...");
_id = value;
}
}
}
Это позволит установить Id
ровно один раз на значение, большее или равное 0. Любые попытки установить его после приведут к InvalidOperationException
. Это означает, что XmlSerializer
сможет установить Id
во время десериализации, но его никогда не удастся изменить после. Обратите внимание, что если свойство является ссылочным типом, вы можете просто проверить его на нулевое значение.
Это может быть не лучшим решением, если у вас есть много свойств только для чтения для сериализации / десериализации, так как для этого потребуется много стандартного кода. Однако я обнаружил, что это приемлемо для классов с 1-2 свойствами только для чтения.
Все еще хак, но это, по крайней мере, немного более надежно.