Statyczna metoda generyczna deserializująca XML

0

Hej, potrzebuję zbudować statyczną metodę generyczną która zdeserializuje xml na liste obiektów i wyświetli je w pętli. O ile wiem coś niecoś na temat każdego rzeczownika tego taska o tyle złączenie ich do kupy mnie przerasta, zbudowałby ktoś w celu pomocy jakiś przykład?

0
        public static void SerializeXML<T>(T obj, string filePath)
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            TextWriter tw = new StreamWriter(filePath);
            xml.Serialize(tw, obj);
            tw.Dispose();
            tw.Close();
        }

        public static T DeserializeXML<T>(string filePath)
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            StreamReader sr = new StreamReader(filePath, Encoding.UTF8);
            T obj = (T)xml.Deserialize(sr);
            sr.Dispose();
            sr.Close();
            return obj;
        }
1
  1. robisz model na podstawie tego co masz w XMLu

przy takim XMLu

string testData = @"<StepList>
                        <Step>
                            <Name>Name1</Name>
                            <Desc>Desc1</Desc>
                        </Step>
                        <Step>
                            <Name>Name2</Name>
                            <Desc>Desc2</Desc>
                        </Step>
                    </StepList>";

model bedzie wygladal nastepujaco

[XmlRoot("StepList")]
public class StepList
{
    [XmlElement("Step")]
    public List<Step> Steps { get; set; }
}

public class Step
{
    [XmlElement("Name")]
    public string Name { get; set; }
    [XmlElement("Desc")]
    public string Desc { get; set; }
}

pozniej na testData robisz

XmlSerializer serializer = new XmlSerializer(typeof(StepList));
using (TextReader reader = new StringReader(testData))
{
    StepList result = (StepList) serializer.Deserialize(reader);
}

wtedy masz caly obiekt w result. Chyba potrafisz sobie poradzic z wyswietleniem listy?

jezeli chcesz z pliku to

using (FileStream fileStream = new FileStream("<PathToYourFile>", FileMode.Open)) 
{
    StepList result = (StepList) serializer.Deserialize(fileStream);
}

a te wszystkie informacje zdobylem robiac nastepujace kroki

  1. wszedlem na google.com
  2. wpisalem xml to model C#
  3. otworzylem pierwszy link https://stackoverflow.com/questions/10518372/how-to-deserialize-xml-to-object

teraz jak masz dla jednego przypadku, pomysl jak zrobic to generycznie

0
AdamWox napisał(a):
        public static void SerializeXML<T>(T obj, string filePath)
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            TextWriter tw = new StreamWriter(filePath);
            xml.Serialize(tw, obj);
            tw.Dispose();
            tw.Close();
        }

        public static T DeserializeXML<T>(string filePath)
        {
            XmlSerializer xml = new XmlSerializer(typeof(T));
            StreamReader sr = new StreamReader(filePath, Encoding.UTF8);
            T obj = (T)xml.Deserialize(sr);
            sr.Dispose();
            sr.Close();
            return obj;
        }

To nie jest to o co pytałem a poza tym jak ktoś nie wie co się dzieję to może wprowadzić w błąd, nie jest mi potrzebny serializer bo wklejam specjlanie w VS plik xml i mam gotowe klasy

0

Świetnie, to co potrzebujesz? Bo już nie rozumiem...

0
fasadin napisał(a):
  1. robisz model na podstawie tego co masz w XMLu

przy takim XMLu

string testData = @"<StepList>
                        <Step>
                            <Name>Name1</Name>
                            <Desc>Desc1</Desc>
                        </Step>
                        <Step>
                            <Name>Name2</Name>
                            <Desc>Desc2</Desc>
                        </Step>
                    </StepList>";

model bedzie wygladal nastepujaco

[XmlRoot("StepList")]
public class StepList
{
    [XmlElement("Step")]
    public List<Step> Steps { get; set; }
}

public class Step
{
    [XmlElement("Name")]
    public string Name { get; set; }
    [XmlElement("Desc")]
    public string Desc { get; set; }
}

pozniej na testData robisz

XmlSerializer serializer = new XmlSerializer(typeof(StepList));
using (TextReader reader = new StringReader(testData))
{
    StepList result = (StepList) serializer.Deserialize(reader);
}

wtedy masz caly obiekt w result. Chyba potrafisz sobie poradzic z wyswietleniem listy?

jezeli chcesz z pliku to

using (FileStream fileStream = new FileStream("<PathToYourFile>", FileMode.Open)) 
{
    StepList result = (StepList) serializer.Deserialize(fileStream);
}

a te wszystkie informacje zdobylem robiac nastepujace kroki

  1. wszedlem na google.com
  2. wpisalem xml to model C#
  3. otworzylem pierwszy link https://stackoverflow.com/questions/10518372/how-to-deserialize-xml-to-object

teraz jak masz dla jednego przypadku, pomysl jak zrobic to generycznie

a co jeśli plik xml jest bardzo duży ? wtedy model też tworzyć ręcznie?

0

nie musisz komentowac kazdego postu na ktory odpowiadasz...

w Visual Studio masz cos takiego jak

Edit => Paste Special => XML as Classes

i masz caly model. Chociaz reczne poprawki i tak mile widziane

1 użytkowników online, w tym zalogowanych: 0, gości: 1