Pergunta

Eu estou usando OpenAccess modelo desconectado. Quando tento desserializar um objeto com DataConractSerializer, a propriedade Version deste objeto é 0 - mas apenas no xml. Se eu depurar o código e ver o valor - é 1 (ou 2,3 ??...)

Se eu disser antes da serialização "temp int = object.Version" o seriazlier pode salvar o valor.

Há um problema de preguiçoso, eu tenho certeza. Como posso forçar a ler / salvar este valor sem chamadas explícitas?

trechos de código: http: //www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451

Foi útil?

Solução

Você deve chamar o método .Retrieve () em seu objeto que irá carregar todos os campos preguiçosos-carregado e você terá todos os dados necessários para a serialização. Espero que ajude.

Outras dicas

Parece que o [DataMember] está definido contra o campo (ou é falta de campos), e está ignorando o comportamento preguiçoso. Se você controlar o tipo, você poderia talvez adicionar um método [OnSerializing] que espreita neste estabelecimento antes de chutes de serialização em ... Dessa forma, ele deve ter um valor, e você não terá que colocar código em outros lugares.

Se o tipo é gerado, olhar para ver se é um partial class. Se assim for, você pode adicionar outro partial class de mesmo nome (e mesmo espaço de nomes), e colocar o seu método [OnSerializing] lá ...

Exemplo (uncomment o último bloco para fazê-lo funcionar):

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top