Comment puis-je sérialiser une liste sans l'élément externe fort> à l'aide du sérialisateur de contrat de données? J'utilise .NET 3.5. J'ai une classe qui contient une liste, entre autres, que je souhaite sérialiser sans que l'élément extérieur soit conforme au XSD pertinent: ce qui précède sériialise comme (supposant qu'un seul paramètre Dans la liste): P> [XmlElement ("Parameter")]
public List<Parameter> Parameters;
3 Réponses :
the Datacontract code> Serializer n'autorise pas ce degré de contrôle sur le XML résulté, vous devrez utiliser plutôt le
xmlSerializer code> afin d'atteindre cet objectif. P>
OK merci. Chaque fois que je cherche quelque chose et que je ne trouve pas le trouver, c'est généralement parce que cela ne peut pas être fait ou c'est si stupide que personne d'autre ne pensait à le faire. Merci de confirmer l'ancien ;-)
Comment puis-je utiliser le XMLSerializer pour contrôler le résultat?
@natenho voir la question, l'OP a déjà une solution pour cela au bas de la question.
DatacontractSérialiseur peut produire cette sortie comme indiqué ci-dessous. Il est faux de dire qu'il ne peut pas
Les travaux ci-dessous utilisent des messagecontract bien que sont un "hack" - il attribue l'élément "myClass" à l'élément de liste et exclut l'espace de noms d'enveloppe pour "myClass".
[ServiceContract(Namespace="")] public interface IService1 { [OperationContract] MyClass GetParameters(); // TODO: Add your service operations here } [DataContract(Namespace="")] public class Parameter { [DataMember] public string ValueName { get; set; } [DataMember] public int Value { get; set; } public Parameter(string ValueName, int Value) { this.ValueName = ValueName; this.Value = Value; } } [MessageContract(IsWrapped = false, WrapperNamespace="")] public class MyClass { [MessageBodyMember(Name = "MyClass", Namespace = "")] public List<Parameter> Parameters { get; set; } }
Utilisez un contrat de données de collecte:
<?xml version="1.0" encoding="utf-16"?> <MyClass xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Serialize.Test"> <Parameter> <Value>1</Value> <ValueName>First</ValueName> </Parameter> <Parameter> <Value>2</Value> <ValueName>Second</ValueName> </Parameter> </MyClass>
Je ne sais pas pourquoi quelqu'un a baissé cela (peut-être qu'ils puissent servir un commentaire quant à la raison. Cela a fonctionné pour moi et est documenté ici: msdn.microsoft.com/en-us/library/...
Je suppose que cela a été évité, car il entraînera toujours un élément externe avec des éléments d'enfant répétitifs. La question demande spécifiquement un moyen de se débarrasser de l'élément extérieur.
La question ne demandait pas de se débarrasser de l'élément extérieur (myClass) qu'il demande de se débarrasser de celui qui sous-t-il (paramètres) ... ce qui est exactement ce que cet attribut fait!
Avec l'élément externe, je parlais de
@Gruff est correct, cela ne fonctionne pas. Peut-être que si l'exemple a été éliminé, nous verrions ce que nous avons fait de manière incorrecte.
@Marcbernier j'ai collé dans le code, comme demandé. Il produit la sortie exacte requise (collé également). Pouvez-vous maintenant annuler votre vote en direct et modifier votre commentaire en indiquant de manière incorrecte cela ne fonctionne pas.
@Gruff comme vous pouvez voir que la sortie ne produit aucun élément
Je ne vois pas pourquoi la réponse actuellement marquée est correcte est la bonne figure - aussi loin que possible, c'est la meilleure réponse à la question telle qu'elle produit la sortie requise à l'aide du DatacontractSérialiseur comme demandé à l'origine demandé.
@Simondowdeswell Veuillez noter, dans votre code, vous êtes simplement sérialiser une instance de paramètre code>. La question a une classe code> myclass code> avec un
paramètres code> propriété. Si
myClass code> a d'autres propriétés également (ce que l'OP indique explicitement: "J'ai une classe qui contient une liste, entre autres choses"), votre solution ne fonctionnera pas.
@Gruff La sortie errante donnée par le questionneur ne contient aucun autre élément et aucun élément n'est demandé dans la sortie souhaitée.
@Gruff - La question en gras est "Comment puis-je sérialiser une liste sans l'élément externe" La tentative de structure ne fonctionne pas. En déplaçant la liste sur la classe mère et en attachant l'attribut comme je l'ai donné dans la réponse originale, vous obtenez ce qui est demandé! Si vous ne voulez pas faire ce changement, c'est votre décision ... mais cela ne rend pas la réponse erronée, ce que vous dites ... et le vote.
@Simondowdeswell - En fait, je n'ai pas fait voter votre réponse, j'ai simplement souligné pourquoi quelqu'un d'autre serait, comme une courtoisie, parce que vous avez déclaré que vous ne savez pas pourquoi quelqu'un serait.
Vous n'avez pas beaucoup de contrôle sur le message formant avec Datacontract. Vous devrez peut-être utiliser Messagecontract - voir MSDN.MicRosoft.com/en-us/ Bibliothèque / MS730255.aspx