valor do DataContractSerializer salto OpenAccess Versão
-
21-08-2019 - |
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
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;
}
}
*/