Звучит так, как будто [DataMember]
настроено против поля (или имеет значение по умолчанию для полей) и игнорирует ленивое поведение. Если вы управляете типом, возможно, вы могли бы добавить метод [OnSerializing]
, который просматривает это свойство до того, как сработает сериализация ... таким образом, оно должно иметь значение, и вам не нужно будет помещать код в другие места.
Если тип сгенерирован, посмотрите, является ли он partial class
. Если это так, вы можете добавить еще один partial class
с тем же именем (и тем же пространством имен) и поместить туда свой метод [OnSerializing]
...
Пример (раскомментируйте последний блок, чтобы он заработал):
using System;
using System.Runtime.Serialization;
using System.Xml;
class Program {
static void Main() {
using (XmlWriter writer = XmlWriter.Create(Console.Out)) {
new DataContractSerializer(typeof(Foo))
.WriteObject(writer, new Foo());
}
}
}
[DataContract]
partial class Foo {
[DataMember(Name="Bar")]
private int? bar;
public int Bar {
get {
if (bar == null) bar = 27; // somthing lazy
return bar.GetValueOrDefault();
}
set { bar = value; }
}
}
/* UNCOMMENT THIS
partial class Foo {
[OnSerializing]
private void BeforeSerialize(StreamingContext ctx) {
int tmp = Bar;
}
}
*/