2009-03-13 6 views
1

J'ai une classe avec plus de 100 propriétés (c'est une classe de mappage de base de données) et l'une des propriétés doit être dans une méthode. En d'autres termes ces données ne sont pas exposées via une propriété, mais par des méthodes:Mélange de sérialisation personnalisée et de base?

"ABCType GetABC(), SetABC (valeur ABCType)"

Il est très un-C# -comme. Je frémis quand je le vois.

La classe doit être sérialisable pour pouvoir être envoyée via des services Web, et les données exposées par les méthodes Get/Set doivent également être sérialisées. (C'est dans une méthode à cause d'une chose étrange que la grille que j'utilise fait avec la réflexion, elle ne peut pas gérer les objets qui contiennent des propriétés du même type que l'objet contenant.) La propriété problem stocke l'état original de l'objet Une implémentation inefficace, oui - mais je ne suis pas capable de la réorganiser.)

Ma question est la suivante: puisque seul ce champ nécessite un code de sérialisation personnalisé, j'aimerais utiliser la sérialisation personnalisée. seulement pour appeler GetABC et SetABC, revenant à la sérialisation XML de base pour le reste de la classe. Cela réduira le potentiel de bogues dans mon code de sérialisation. Y a-t-il un moyen?

Répondre

2

La première chose que je vais essayer est d'ajouter une propriété pour la sérialisation, mais cachant de l'interface utilisateur:

[Browsable(false)] // hide in UI 
public SomeType ABC { 
    get {return GetABC();} 
    set {SetABC(value);} 
} 

Vous ne pouvez pas vraiment mélanger et sérialisation match malheureusement; une fois que vous implémentez IXmlSerializable, vous possédez tout. Si vous utilisez WCF, puis DataContractSerialier supporte les propriétés non publiques pour la sérialisation, vous pouvez utiliser:

[DataMember] 
private SomeType ABC { 
    get {return GetABC();} 
    set {SetABC(value);} 
} 

mais cela ne vaut pas pour les services Web « asmx » via XmlSerializer.

Est-ce que la astuce [Browsable] fonctionne? En supposant que la grille personnalisée utilise TypeDescriptor, une autre option pourrait être de le cacher via ICustomTypeDescriptor, mais c'est beaucoup de travail juste pour cacher une propriété ...

+0

Le truc [Browsable] ne fonctionne pas car il ne se cache pas la propriété de l'appel de la grille à typeof (SomeType) .GetProperties (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); Cependant, vous avez répondu à la question sur la sérialisation mixte, alors merci! –

Questions connexes