2009-03-21 9 views
1

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

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

Il y a un problème paresseux, j'en suis sûr. Comment puis-je forcer à lire/enregistrer cette valeur sans appels explicites?

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

Répondre

2

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

+0

Voilà la réponse, merci. – boj

2

Il semble que le [DataMember] est réglé sur le champ (ou est par défaut à des champs), et contourne le comportement paresseux. Si vous contrôlez le type, vous pouvez peut-être ajouter une méthode [OnSerializing] qui jette un coup d'œil à cette propriété avant que la sérialisation ne démarre ... de cette façon, elle devrait avoir une valeur, et vous n'aurez pas besoin de mettre du code dans d'autres endroits. Si le type est généré, regardez s'il s'agit d'un partial class. Si oui, vous pouvez ajouter un autre partial class du même nom (et même espace de noms), et de mettre votre méthode [OnSerializing] là-dedans ...

Exemple (uncomment le dernier bloc pour le faire fonctionner):

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; 
    } 
} 
*/ 
+0

Bonne solution! Avec une classe de base pour toutes mes classes DAL peut résoudre le problème. Si Telerik ne dit rien sur ce problème, je pense que votre réponse est une excellente solution. – boj

+0

S'il s'agit d'une classe de base, vous voudrez peut-être créer une protection virtuelle "BeforeSerialize", afin que les classes héritées puissent ajouter à la partie ... –

+0

Oui ... mais malheureusement OpenAcces ne fonctionne pas facilement avec les classes de base (ou I ' Je manque juste quelque chose, c'est mon premier jour en tant qu'utilisateur OA). Il ignore les membres hérités dans l'attribut "Persistant" de la classe enfant - mais c'est peut-être un nouveau fil :) – boj

Questions connexes