[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;
}
}
*/
これは答えです、ありがとうございます。 – boj