DataContractSerializer пропускает значение версии OpenAccess
-
21-08-2019 - |
Вопрос
Я использую отключенную модель OpenAccess.Когда я пытаюсь десериализовать объект с помощью DataConractSerializer, свойство Version этого объекта равно 0 - но только в xml.Если я отлажу код и посмотрю значение - это 1 (или 2,3 ...)
Если я скажу перед сериализацией "int temp = object.Version", сериализатор может сохранить значение.
Я уверен, что это проблема с ленивостью.Как я могу принудительно прочитать / сохранить это значение без явных вызовов?
Фрагменты кода: http://www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451
Решение
вы должны вызвать метод .Retrieve() для вашего объекта, который загрузит все отложенные поля, и у вас будут все данные, необходимые для сериализации.Надеюсь, это поможет.
Другие советы
Это звучит как [DataMember]
устанавливается на поле (или используется по умолчанию для полей) и обходит ленивое поведение.Если вы управляете типом, вы, возможно, могли бы добавить [OnSerializing]
метод, который просматривает это свойство перед запуском сериализации...таким образом, у него должно быть значение, и вам не нужно будет помещать код в другие места.
Если тип сгенерирован, посмотрите, является ли он partial class
.Если это так, вы можете добавить еще один partial class
с тем же именем (и тем же пространством имен), и поместите свой [OnSerializing]
метод там...
Пример (раскомментируйте последний блок, чтобы он заработал):
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;
}
}
*/