Quels sont les avantages d'utiliser [DataContract] plutôt que [Serialisable] dans WCF?
6 réponses
Voir un grand comparaison de XmlSerializer et DataContractSerializer sur le blog de Dan Rigsby.
quelques points en faveur de DataContractSerializer:
- environ 10% plus rapide que XmlSerializer
- va sérialiser rien décorées avec un
[DataMember]
- même si ce n'est paspublic
visible - ne sera pas sérialiser rien à moins que vous dire précisément ce qu'il ("opt-in")
- vous pouvez définir l'ordre d' dans lequel les éléments sont sérialisés en utilisant le
Order=
attribut[DataMember]
- ne nécessite pas un constructeur sans paramètre pour la désérialisation
il y a une question qui n'a pas encore été répondue par les autres ici: si vous utilisez [Serializable]
, mais toujours utiliser DataContractSerializer
pour sérialiser ce type? Est-ce différent de la sérialisation d'un [DataContract]
tapez DataContractSerializer
?
La réponse: il fait absolument pas de différence! La raison en est que lorsque vous passez dans n'importe quel type DataContractSerializer
, sur le premier épisode de sérialisation ou de desérialisation, il "déchire" le type à un structure interne qui contient toutes les informations sur les membres du type, etc. Il utilise ensuite la structure interne mise en cache (conservée par il dynamique) pour les épisodes de sérialisation suivants, ne retournant jamais au type original.
aussi, si vous comparez DataContractSerializer
's de la sérialisation de [Serializable]
types vs. XmlSerializer
's de la sérialisation de ces mêmes types, vous trouverez est exponentiellement plus rapide. Un peu de cela est visible dans la comparaison des performances livre blanc disponible ici: http://msdn.microsoft.com/en-us/library/bb310550.aspx
vous pouvez également garder à l'esprit que le DataContract est plus axé sur le consommateur que XmlSerializer.
alors que le XmlSerializer a une dimension purement technique ("comment transformer cet objet en XML"), le DataContract est la représentation publique d'un concept d'entreprise.
en tant que tel le DataContract agit comme un rappel que chaque changement que vous apporterez à votre classe aura un impact sur les consommateurs et que vous êtes implicitement lié par ce contrat. Conceptuellement, le DataContract est un élément central de votre architecture de service, XmlSerializer n'est qu'un assistant.
principaux problèmes avec XmlSerializer pour sérialiser les types .NET en XML
- seuls les champs publics ou les propriétés des types .NET peuvent être traduits en XML
- Uniquement les classes qui implémentent l'interface IEnumerable
- les Classes qui implémentent L'interface IDictionary, telles que les tables de hachage ne peuvent pas être sérialisées Différence importante entre DataContractSerializer et XMLSerializer
Un avantage pratique de la conception de la DataContractSerializer est une meilleure performance que Xmlserializer.
- la sérialisation XML n'indique pas quels champs OU propriétés du type sont sérialisés en XML alors que DataCotractSerializer
- montre explicitement quels champs OU propriétés sont sérialisés en XML
- le DataContractSerializer peut traduire le HashTable en XML
il n'y a pas de véritable base de comparaison si tout ce que vous faites est de sérialiser et de desérialiser à partir de XML, à l'exception des différences syntaxiques et des fonctionnalités mineures. L'avantage le plus puissant de DataContract sur Serialisable - quelque chose que tout le monde semble sauter sur - est que les contrats de données ne sont pas spécifiques à XML.
avec les contrats de données, il n'y a que deux constructions logiques: les contrats de données et les membres de données (membres d'un contrat de données). Il n'y a pas de tels les éléments d'un contrat de données en tant qu ' "éléments" ou "éléments xml".
en théorie, la sérialisation basée sur un contrat de données permet de représenter une structure d'objet dans n'importe quel format d'échange de données, bien QU'AFAIK seulement XML et JSON serialization/deserialization soient disponibles dans le cadre de .NET pour le moment. Cependant, il est certainement possible de créer un sérialiseur qui fonctionne avec, disons, RDF, et je soupçonne qu'il y a des sérialiseurs supplémentaires là-bas.
Envisager la simple ci-dessous architecture:
C#
[DataContract]
class Company
{
[DataMember]
public string Name { get; set }
[DataMember]
public Person[] People { get; set }
}
[DataContract]
class Person
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
}
ce contrat n'est pas spécifique au XML. Vous n'avez pas précisé quoi que ce soit concernant le XML. Vous pouvez sérialiser une instance de l'architecture ci-dessus soit en XML:
XML
<Company>
<Name>...</Name>
<People>
<Person>
<FirstName>James</FirstName>
<LastName>Sunderland</LastName>
</Person>
...
</People>
</Company>
... ou dans JSON:
JSON
{
"Company": {
"Name": "...",
"People": [
{
"FirstName": "James",
"LastName": "Sunderland"
},
...
]
}
}
... ou dans n'importe quel format d'échange de données, aussi longtemps que vous êtes en possession d'un sérialiseur pour que format.
Ceci est très puissant et flexible, surtout si vous avez un service web qui est consommé par plusieurs types de clients et de pairs, ou si le groupe de consommateurs de votre service web est sujet à l'expansion dans le futur:
- JSON est plus facile à sérialiser / deserialiser dans les serveurs JavaScript et PHP (ou n'importe quel langage dynamique),
- XML est plus simple à sérialiser/deserialiser dans les clients de la FMC.
Si vous ne voulez pas limitez-vous au XML comme le seul format d'échange de données dans votre architecture d'application, je vous recommande D'aller avec DataContract. Autrement, Serializable est légèrement plus utile pour XML seulement.
bien que cette question soit assez ancienne, je résumerai ma compréhension:
1) Datacontract vous donne la flexibilité de sérialiser certains membres ou champs en utilisant l'attribut (DataMember). 2) Vous pouvez décider avec DataContract l'ordre dans lequel les objets seront sérialisés.
mis à part les choses évidentes comme DataContract sérialise vos membres publics tandis que Serialisable sérialisera par défaut vos champs présents.