DataContractSerializer ignorare il valore di OpenAccess Version
-
21-08-2019 - |
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
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;
}
}
*/