DataContractSerializerのOpenAccessのバージョンの値をスキップ
-
21-08-2019 - |
質問
私はのOpenAccess切断モデルを使用しています。私はDataConractSerializerでオブジェクトをデシリアライズしようとすると、このオブジェクトのバージョンプロパティが0である - しかし、唯一のxmlインチ私はコードをデバッグし、値を見れば - それは1(または2,3 ...)です。
私が言うなら連載 "int型のTEMP = object.Version" 前の値を保存することができseriazlierます。
私は確信している、怠惰な問題があります。どのように私は明示的な呼び出しなしで、この値を読み込み/保存するために強制することができますか?
解決
あなたはすべてのレイジーロードされたフィールドをロードしますあなたのオブジェクト上.Retrieve()メソッドを呼び出す必要がありますし、シリアル化のために必要なすべてのデータを持っています。ホープことができます。
他のヒント
これは[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;
}
}
*/