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

¿Fue útil?

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;
    }
}
*/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top