Domanda

sto usando OpenAccess modello disconnesso. Quando provo a deserializzare un oggetto con DataConractSerializer, la proprietà versione di questo oggetto è 0 - ma solo nel xml. Se metto a punto il codice e guardo il valore - è 1 (o 2,3 ...)

Se dico prima della serializzazione "int temp = object.Version" il seriazlier può salvare il valore.

Esiste un problema pigro, ne sono sicuro. Come posso forzare di leggere / salvare questo valore senza chiamate esplicite?

frammenti di codice: http: //www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451

È stato utile?

Soluzione

si dovrebbe chiamare il metodo .Retrieve () sul vostro oggetto che caricherà tutti i campi pigri-caricato e avrete tutti i dati necessari per la serializzazione. Speranza che aiuta.

Altri suggerimenti

Sembra che il [DataMember] si contrappone il campo (o è inadempiente ai campi), e bypassa il comportamento pigro. Se controlli il tipo, si potrebbe eventualmente aggiungere un metodo di [OnSerializing] che fa capolino in questa struttura prima di calci di serializzazione in ... in questo modo si dovrebbe avere un valore, e non avrete bisogno di mettere il codice in altri luoghi.

Se si genera il tipo, guardare per vedere se si tratta di un partial class. Se è così, si può aggiungere un altro <=> con lo stesso nome (e lo stesso spazio dei nomi), e mettere il vostro metodo di <=> in là ...

Esempio (-commentare l'ultimo blocco per farlo funzionare):

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;
    }
}
*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top