2009-04-06 8 views
2

Je convertis certaines de mes classes pour utiliser DataContractSerialization afin que je puisse inclure des entités Linq dans la sortie. Une sorte de question théorique a surgi dans ma tête pendant que j'étais en train de faire le pari, et pendant que je parie que la réponse est «Non», j'ai pensé que je poserais la question de toute façon.Pouvez-vous obtenir un contrôle conditionnel sur la sérialisation avec DataContractSerializer?

Existe-t-il un moyen de sérialiser de façon conditionnelle un objet? Par exemple, si je suis en train de sérialiser un objet employé avec l'intention d'envoyer des informations à un client, il est possible que je ne souhaite pas inclure l'adresse. D'autre part, si je suis en série pour l'utiliser dans un service web pour le site qui gère cet employé, je pourrais avoir besoin de cette information.

Une autre possibilité consisterait à sérialiser certains membres selon qu'ils étaient ou non l'objet de base en cours de sérialisation. Donc, si j'ai une classe Ticket qui contient un emplacement, et l'emplacement contient une liste de contacts, je ne voudrais probablement pas que cette liste de contacts si je sérialisais le billet. Mais si j'essayais de travailler avec l'emplacement lui-même, il pourrait être bon d'avoir.

Alors, des idées là-dessus?

Répondre

0

Je n'ai pas encore utilisé WCF, mais je sais qu'avec la sérialisation standard en .Net (basé sur un attribut), je pourrais avoir une méthode OnSerializing et OnDeserialized sur une classe; Peut-être que WCF offre quelque chose de similaire? Au sein de ces méthodes, vous pouvez supprimer des données de manière conditionnelle (bien que vous ayez à l'esprit que cela signifie que votre objet a changé, ce qui est un mauvais effet secondaire de la sérialisation).

Exemple:

public class Employee 
{ 
    public Address HomeAddress { get; set; } 

    [OnSerializing] 
    private void RemoveAddress(StreamingContext context) 
    { 
     if (1 == 1) // replace with your condition 
      HomeAddress = null; 
    } 

    [OnDeserialized] 
    private void PutAddressBack(StreamingContext context) 
    { 
     if (1 == 1) 
      HomeAddress = LoadHomeAddressFromBackingStore(); 
    } 
} 
0

Je recommande de ne pas retourner directement LINQ to SQL ou des objets ADO.NET Entity Framework à partir d'un service Web. Malheureusement, cela sérialise les détails de l'implémentation. Par exemple, les champs de classe de base sont également sérialisés, tout comme les liens de retour.

Questions connexes