質問

私はのOpenAccess切断モデルを使用しています。私はDataConractSerializerでオブジェクトをデシリアライズしようとすると、このオブジェクトのバージョンプロパティが0である - しかし、唯一のxmlインチ私はコードをデバッグし、値を見れば - それは1(または2,3 ...)です。

私が言うなら連載 "int型のTEMP = object.Version" 前の値を保存することができseriazlierます。

私は確信している、怠惰な問題があります。どのように私は明示的な呼び出しなしで、この値を読み込み/保存するために強制することができますか?

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

役に立ちましたか?

解決

あなたはすべてのレイジーロードされたフィールドをロードしますあなたのオブジェクト上.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;
    }
}
*/
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top