[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;
}
}
*/