Frage

Ich verwende OpenAccess- getrennt Modell. Wenn ich versuche, ein Objekt mit DataConractSerializer deserialisieren, ist die Version-Eigenschaft dieses Objekts 0 - aber nur in der XML. Wenn ich den Code debuggen und den Wert sehen - es ist 1 (oder 2,3 ...)

Wenn ich sage, vor der Serialisierung "int temp = object.Version" der seriazlier kann den Wert speichern.

Es ist ein faules Problem, ich bin sicher. Wie kann ich erzwingen, ohne explizite Anrufe diesen Wert lesen / speichern?

Code-Schnipsel: http: //www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451

War es hilfreich?

Lösung

sollten Sie den .Retrieve () -Methode auf Ihrem Objekt aufrufen, die alle faul belasteten Felder laden, und Sie werden alle Daten für die Serialisierung erforderlich sind. Hoffe, das hilft.

Andere Tipps

Es klingt wie die [DataMember] gegen das Feld gesetzt ist (oder auf Felder in Verzug) und wird das faule Verhalten zu umgehen. Wenn Sie die Art steuern, könnten Sie vielleicht eine [OnSerializing] Methode hinzufügen, die vor der Serialisierung Tritte auf diese Eigenschaft späht in ... diese Weise sollte es einen Wert haben, und Sie werden nicht-Code in anderen Orten setzen müssen.

Wenn der Typ erzeugt wird, um zu sehen, ob es ein partial class ist. Wenn ja, können Sie eine andere partial class mit dem gleichen Namen hinzufügen (und gleichen Namensraum), und setzen Sie Ihre [OnSerializing] Methode dort ...

Beispiel (Kommentar- den letzten Block, damit es funktioniert):

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;
    }
}
*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top