Question

J'utilise le modèle déconnecté OpenAccess.Lorsque j'essaie de désérialiser un objet avec DataConractSerializer, la propriété Version de cet objet est 0 - mais uniquement dans le XML.Si je débogue le code et regarde la valeur, c'est 1 (ou 2,3...)

Si je dis avant la sérialisation "int temp = object.Version", le seriazlier peut sauvegarder la valeur.

Il y a un problème paresseux, j'en suis sûr.Comment puis-je forcer la lecture/l'enregistrement de cette valeur sans appels explicites ?

Extraits de code: http://www.telerik.com/community/forums/orm/general-discussions/objectnetwork-vs-datacontractserializer.aspx#775451

Était-ce utile?

La solution

vous devez appeler la méthode .Retrieve() sur votre objet qui chargera tous les champs chargés paresseux et vous aurez toutes les données requises pour la sérialisation.J'espère que cela pourra aider.

Autres conseils

On dirait que [DataMember] est défini par rapport au champ (ou est par défaut sur les champs) et contourne le comportement paresseux.Si vous contrôlez le type, vous pourriez peut-être ajouter un [OnSerializing] méthode qui jette un coup d'œil à cette propriété avant que la sérialisation ne démarre...de cette façon, il devrait avoir une valeur et vous n'aurez pas besoin de mettre du code ailleurs.

Si le type est généré, regardez s'il s'agit d'un partial class.Si c'est le cas, vous pouvez en ajouter un autre partial class du même nom (et du même espace de noms), et mettez votre [OnSerializing] méthode là-dedans...

Exemple (décommentez le dernier bloc pour que cela fonctionne) :

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;
    }
}
*/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top