DataContractSerializer omitir el valor de OpenAccess Versión
-
21-08-2019 - |
Pregunta
Estoy usando OpenAccess modelo desconectado. Cuando trato de deserializar un objeto con DataConractSerializer, la propiedad versión de este objeto es 0 - pero sólo en el xml. Si puedo depurar el código y ver el valor - es 1 (o 2,3 ...)
Si digo antes de la serialización "int temp = object.Version" la seriazlier puede guardar el valor.
Hay un problema perezoso, estoy seguro. ¿Cómo puedo forzar a leer / guardar este valor sin llamadas explícitas?
Los fragmentos de código: http: //www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451
Solución
usted debe llamar al método .Retrieve () en el objeto que va a cargar todos los campos-cargado ligeramente y usted tendrá todos los datos necesarios para la serialización. Esperamos que ayuda.
Otros consejos
Parece que el [DataMember]
se sitúa en el campo (o campos utiliza de forma predeterminada), y está dejando de lado el comportamiento perezoso. Si se controla el tipo, tal vez podría añadir un método [OnSerializing]
que se asoma en esta propiedad antes de patadas de serialización de las ... de esa manera debe tener un valor, y usted no tendrá que poner código en otros lugares.
Si se genera el tipo, mira a ver si es un partial class
. Si es así, se puede añadir otro <=> del mismo nombre (y el mismo espacio de nombres), y poner su método <=> allí ...
Ejemplo (elimine el último bloque para que funcione):
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;
}
}
*/