2009-03-21 5 views
1

私はOpenAccessの非接続モデルを使用しています。 DataConractSerializerでオブジェクトを逆シリアル化しようとすると、このオブジェクトのVersionプロパティは0になりますが、xmlでのみ発生します。DataContractSerializerはOpenAccessバージョンの値をスキップ

私がシリアル化 "int temp = object.Version"の前に言うなら、seriazlierは値を保存することができます。

怠け者の問題があります。明示的な呼び出しなしでこの値を読み込み/保存するにはどうすればよいですか?

コードスニペット:http://www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451

答えて

2

オブジェクトの.Retrieve()メソッドを呼び出すと、遅延ロードされたすべてのフィールドがロードされ、シリアル化に必要なすべてのデータが取得されます。希望が役立ちます。

+0

これは答えです、ありがとうございます。 – boj

2

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

素晴らしい回避策!すべての私のDALクラスのための1つの基本クラスで問題を解決することができます。 Telerikがその問題について何も言わないなら、あなたの答えは素晴らしい解決策だと思います。 – boj

+0

基本クラスの場合、継承されたクラスがパーティに追加できるように、 "BeforeSerialize"を保護された仮想にすることができます... –

+0

はい...しかし悲しいことに、OpenAccesは基底クラスでは簡単に動作しません。私は何かが欠けている、これはOAユーザとしての私の最初の日です)。 子クラスの "Persistent"属性で継承されたメンバーを無視しますが、これは新しいスレッドかもしれません:) – boj

関連する問題