DataContractSerializer пропустить значение OpenAccess версии - PullRequest
1 голос
/ 22 марта 2009

Я использую отключенную модель OpenAccess. Когда я пытаюсь десериализовать объект с помощью DataConractSerializer, свойство Version этого объекта равно 0 - но только в XML. Если я отлаживаю код и смотрю значение - это 1 (или 2,3 ...)

Если я скажу перед сериализацией "int temp = object.Version", seriazlier может сохранить значение.

Есть ленивая проблема, я уверен. Как я могу заставить читать / сохранять это значение без явных вызовов?

Фрагменты кода: http://www.telerik.com/community/forums/orm/general-discussions/objectnetworkattacher-vs-datacontractserializer.aspx#775451

Ответы [ 2 ]

2 голосов
/ 23 марта 2009

вы должны вызвать метод .Retrieve () для вашего объекта, который загрузит все ленивые поля и у вас будут все данные, необходимые для сериализации. Надеюсь, это поможет.

2 голосов
/ 22 марта 2009

Звучит так, как будто [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;
    }
}
*/
...