Mon application Serialise les objets dans les flux.
Voici un échantillon de ce dont j'ai besoin: Dans ce cas, l'objet est une collection d'objet "Liens". P> ------------ --- La première version p> Au début, j'ai utilisé le Voici l'objet: p> et voici le résultat: p> ------------ deuxième version p> < p> OK, pas silencieux ce que je veux, j'ai donc essayé le classique xmlsérializer strong>, mais ... Oh nooo, vous ne pouvez pas spécifier le nom de l'élément racine et des éléments de la collection si l'élément racine est Une collection ... p> Voici le code: p> Voici le résultat: p> Utilisation Et son résultat: p> sympa, mais je ne veux pas ce nœud racine !!
Je veux que ma collection soit le nœud racine. P> Voici les contraintes: p> Quelles sont mes solutions maintenant: p> aucune idée? p> Qu'est-ce qui me dérange vraiment dans cette question, est que ce que je veux semble être vraiment vraiment simple ... p> p>
3 Réponses :
XMLSerializer doit pouvoir faire ce dont vous avez besoin, mais il dépend fortement de la structure et de la configuration initiales. Je l'utilise dans mon propre code pour générer des choses remarquablement similaires. MAINTENANT, SERIALISANT LES LIENS CODE> CODE> La classe doit générer exactement ce que vous recherchez. P> Le problème avec XMLSerializer est lorsque vous lui donnez des génériques, il répond avec des génériques. Liste des impléments de remplacement quelque part dans la présente et le résultat sérialisé sera presque toujours Arrayof
Votre solution est très proche de la solution finale, mais je ne peux pas spécifier directement un nom d'attribut racine dans le constructeur XMLSerializer (le code de sérialisation est ailleurs), j'ai essayé de «déduire» en sérialisement, qui a fonctionné pour le nœud racine, mais pas pour les éléments. La solution a été donnée par Mike avec l'attribut «xmltype» que je ne connaissais pas.
Bits de solution combinés. Yay. Heureux d'avoir pu aider si = D
Ici vous allez ...
class Program { static void Main(string[] args) { Links ls = new Links(); ls.Link.Add(new Link() { Name = "Mike", Url = "www.xml.com" }); ls.Link.Add(new Link() { Name = "Jim", Url = "www.xml.com" }); ls.Link.Add(new Link() { Name = "Peter", Url = "www.xml.com" }); XmlSerializer xmlSerializer = new XmlSerializer(typeof(Links)); StringWriter stringWriter = new StringWriter(); xmlSerializer.Serialize(stringWriter, ls); string serializedXML = stringWriter.ToString(); Console.WriteLine(serializedXML); Console.ReadLine(); } } [XmlRoot("Links")] public class Links { public Links() { Link = new List<Link>(); } [XmlElement] public List<Link> Link { get; set; } } [XmlType("Link")] public class Link { [XmlAttribute("Name")] public string Name { get; set; } [XmlAttribute("Href")] public string Url { get; set; } }
Merci pour votre réponse. Votre solution a quelques problèmes - 1) ne fonctionne pas à cela, car les éléments ne sont pas renommés (vous avez triché, vous avez appelé le type 'link' afin que les éléments de sortie sont
OK, voici ma solution finale (espère que cela aide quelqu'un), qui peut sérialiser un tableau uni, liste , hashset , ...
Pour y parvenir, nous devrons dire au sérialisateur. Quel nœud racine à utiliser, et c'est un peu difficile ... p>
1) Utilisez 'xmltype' sur l'objet sérialisable p> 2) code A «Méthode« détecteur de racine intelligente », qui retournera un xmlrooTatTtribute p> [XmlType("link")]
[XmlTypeInCollection("links")]
public class LinkFinalVersion
{
}
Je voudrais tricher et sérialiser cela «comme il vient», puis appliquez une transformation XSL sur le XML résultant pour le masser à ce dont vous avez besoin. Alternativement, avez-vous regardé [Messagecontract]? Il offre beaucoup plus de personnalisation sur la sortie que Datacontract
La tricherie XSL n'est pas une option car le sérialisateur écrit directement dans un ruisseau ... et merci pour la tête [Messagecontract], j'ai appris quelque chose aujourd'hui ^^ Cependant, il est profondément lié à la WCF et ne permet pas de contrôler finement une simple sérialisation XML ( Je me trompe peut-être, Jsut a découvert l'attribut)