170 votes

Est-il possible de le désérialiser XML dans la liste<T>?</T>

Étant donné le code XML suivant :

Et la classe suivante :

Est-il possible d’utiliser pour désérialiser le code xml dans un ? Si oui, quel type d’attributs supplémentaires dois-je utiliser, ou quels sont les paramètres supplémentaires dois-je utiliser pour construire le `` instance ?

Un tableau ( `` ) serait acceptable, si un peu moins préférable.

156voto

Marc Gravell Points 482669

Vous pouvez encapsuler la liste trivialement :

62voto

richaux Points 811

Si vous décorez l' User classe avec l' XmlType pour correspondre à la nécessaire capitalisation:

[XmlType("user")]
public class User
{
   ...
}

Puis l' XmlRootAttribute sur le XmlSerializer ctor peut fournir à la racine de votre choix et de permettre la lecture directe dans la Liste<>:

    // e.g. my test to create a file
    using (var writer = new FileStream("users.xml", FileMode.Create))
    {
        XmlSerializer ser = new XmlSerializer(typeof(List<User>),  
            new XmlRootAttribute("user_list"));
        List<User> list = new List<User>();
        list.Add(new User { Id = 1, Name = "Joe" });
        list.Add(new User { Id = 2, Name = "John" });
        list.Add(new User { Id = 3, Name = "June" });
        ser.Serialize(writer, list);
    }

...

    // read file
    List<User> users;
    using (var reader = new StreamReader("users.xml"))
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(List<User>),  
            new XmlRootAttribute("user_list"));
        users = (List<User>)deserializer.Deserialize(reader);
    }

Crédit: basé sur la réponse de YK1.

18voto

Coincoin Points 12823

Oui, il va sérialiser et désérialiser une Liste de<>. Juste assurez-vous que vous utilisez le [XmlArray] attribut en cas de doute.

[Serializable]
public class A
{
    [XmlArray]
    public List<string> strings;
}

Cela fonctionne à la fois avec Serialize() et Deserialize().

15voto

user598047 Points 116

Je pense avoir trouvé une meilleure façon. Vous n'avez pas à mettre des attributs dans vos classes. J'ai fait deux méthodes pour la sérialisation et la désérialisation qui prennent liste générique en tant que paramètre.

Prendre un coup d'oeil (il fonctionne pour moi):

private void SerializeParams<T>(XDocument doc, List<T> paramList)
    {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(paramList.GetType());

        System.Xml.XmlWriter writer = doc.CreateWriter();

        serializer.Serialize(writer, paramList);

        writer.Close();           
    }

private List<T> DeserializeParams<T>(XDocument doc)
    {
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<T>));

        System.Xml.XmlReader reader = doc.CreateReader();

        List<T> result = (List<T>)serializer.Deserialize(reader);
        reader.Close();

        return result;
    }

De sorte que vous pouvez sérialiser quelle que soit la liste que vous voulez! Vous n'avez pas besoin de spécifier le type de liste à chaque fois.

        List<AssemblyBO> list = new List<AssemblyBO>();
        list.Add(new AssemblyBO());
        list.Add(new AssemblyBO() { DisplayName = "Try", Identifier = "243242" });
        XDocument doc = new XDocument();
        SerializeParams<T>(doc, list);
        List<AssemblyBO> newList = DeserializeParams<AssemblyBO>(doc);

5voto

JaredPar Points 333733

Pas sûr au sujet de la Liste<T>, mais les Tableaux sont certainement en mesure. Et un peu de magie, il est vraiment facile d'obtenir une Liste de nouveau.

public class UserHolder {
   [XmlElement("list")]
   public User[] Users { get; set; }

   [XmlIgnore]
   public List<User> UserList { get { return new List<User>(Users); } }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X