1

OpenAccess 切断モデルを使用しています。DataConractSerializer を使用してオブジェクトを逆シリアル化しようとすると、このオブジェクトの Version プロパティが 0 になりますが、xml のみです。コードをデバッグして値を見ると、1 (または 2,3...) です。

シリアライゼーションの前に「int temp = object.Version」と言えば、シリアズリエは値を保存できます。

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

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

4

2 に答える 2

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;
    }
}
*/
于 2009-03-21T23:05:24.290 に答える
2

オブジェクトで .Retrieve() メソッドを呼び出す必要があります。これにより、遅延ロードされたすべてのフィールドがロードされ、シリアル化に必要なすべてのデータが得られます。それが役立つことを願っています。

于 2009-03-23T17:04:28.507 に答える