Avatar billede pfp Nybegynder
15. februar 2007 - 14:26 Der er 13 kommentarer og
1 løsning

Serialize liste af objekter

Hej.

Jeg har en List<object> med objekter af flere forskellige typer.

Jeg vil gerne have disse objekter serialiseret på en hensigtsmæssig måde.

foreach (object o in objects)
{
  XmlSerializer serializer = new XmlSerializer(o.GetType());
  serializer.Serialize(stream, o);
}

Hvis jeg læser de rå xml data ud igen er objekterne blevet serialiseret, men i og med at jeg instantierer en ny XmlSerializer pr. objekt, så appender den også xml dokumentet sammen som mange selvstændige dokumenter i et dokument.

Eksempel:

<xml version="1">
<mitObjekt>Foo</mitObjekt>
<xml version="1">
<ditObjekt>Bar</ditObjekt>

Det er ikke videre hensigtsmæssig for det er naturligvis min tanke at jeg gerne vil have xml dokumentet deserialiseret så jeg igen står med min oprindelige List<object>

Nogen der har gode forslag til hvordan jeg kan gribe det an?
Avatar billede Syska Mester
15. februar 2007 - 14:31 #1
kan du ikke bare Serialize dit List<object>, i stedet for at Loop gennem hver ....
Avatar billede kalp Novice
15. februar 2007 - 14:37 #2
XmlSerializer serializer = new XmlSerializer();
foreach (object o in objects)
{
  serializer.Serialize(stream, o);
}

eller

foreach (object o in objects)
{
  serializer.Serialize(stream, o.GetType());
}

men det er vel fordi du opretter den der serializer hver gang du får den der xml.

og ellers ja så kan du gemme hele listen!
Avatar billede pfp Nybegynder
15. februar 2007 - 15:25 #3
buzzz -> Nej det vil den ikke i og med listen består af forskellige typer. Havde de været af samme type så tror jeg også det var vejen frem. Men 2. parameter i Serialize metoden kræver typeangivelse, og der vil den ikke godtage object eller List<object> som type.
Avatar billede kalp Novice
15. februar 2007 - 15:44 #4
dfp >> en side kommentar.. du må gerne kommentere alle indlæg i en tråd... så er det nemmere at hjælpe dig med dit problem.

med hensyn til din stream så kan du lave den til
Stream stream = new FileStream(filnavn, FileMode.Append, FileAccess.Write, FileShare.None);

selvfølgelig  FileMode.Append jeg tror muligvis kan afhjælpe.

og med hensyn til din List så kan du vel skrive

List<object> list = new List<object>();
XmlSerializer serializer = new XmlSerializer(list.GetType());

burde vel fungere fint hvis dine objekter alle er serializable.
Avatar billede pfp Nybegynder
15. februar 2007 - 16:30 #5
Hej qawi.

Det er bestemt også min intention at kommentere dit indlæg. Jeg har blot ikke haft mulighed for at afprøve det endnu..

Jeg syntes jeg har prøvet at serialisere listen som du foreslår, men jeg må hellere prøve igen for at være sikker.
Avatar billede pfp Nybegynder
15. februar 2007 - 17:20 #6
qawi ->
XmlSerializer serializer = new XmlSerializer();

Ovenstående kan ikke lade sig gøre. Den kan ikke instantieres uden parametre.

Og nedenstående:
foreach (object o in objects)
{
  serializer.Serialize(stream, o.GetType());
}

er heller ikke gyldigt. Den skal have en stream og et objekt, og ikke en stream og en type.

XmlSerializer serializer = new XmlSerializer(list.GetType()); har jeg lige forsøgt, men det kan ikke lade sig gøre heller, da den så forsøger at caste samtlige objekter i listen til List<object> og det kan de naturligvis ikke :(

Alternativt kan jeg jo bygge et xml dokument op manuelt, men jeg syntes bare næsten det andet her bør kunne lade sig gøre på en måde.
Avatar billede kalp Novice
15. februar 2007 - 17:25 #7
Det skal ikke være løsningen selvfølgelig, men hvis du gemmer din List<object>
i en klasse du selv definere og gør den serializable så burde du faktisk godt kunne angive den som parameter til xmlserializer, men så skal du tilgå din liste igennem dit eget objekt via. properties.
Avatar billede pfp Nybegynder
15. februar 2007 - 18:13 #8
Det er da en idé jeg vil må have afprøvet. Jeg tvivler dog stadig en smule i og med den ikke på den får lavet et GetType() opslag pr. objekt - er bange for den så bare går et niveau længere op og så vil forsøge at caste samtlige typer til min liste-klasse-type..

Men jeg vil lige forsøge at lege med det...
Avatar billede kalp Novice
15. februar 2007 - 18:34 #9
hmm.. nu har jeg ikke lavet mine egne klasse men lavede en hurtig test og fik dette

<?xml version="1.0"?>
<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <anyType xsi:type="xsd:string">hejsa</anyType>
  <anyType xsi:type="xsd:int">22</anyType>
</ArrayOfAnyType>


og med koden


      private List<object> list = new List<object>();
 
            list.Add("hejsa");
            list.Add(22);
            Stream stream = new FileStream("c:\\test.xml", FileMode.Create, FileAccess.Write, FileShare.None);
            XmlSerializer serialize = new XmlSerializer(list.GetType());
            serialize.Serialize(stream, list);
Avatar billede kalp Novice
15. februar 2007 - 18:43 #10
ahh okay.. på dine egne objekter skal du angive hvordan den skal gemme dit objekt i xml via. attributter.
Du bliver nød til at læse dette
http://msdn2.microsoft.com/en-us/library/2baksw0z(VS.80).aspx
Avatar billede pfp Nybegynder
15. februar 2007 - 19:18 #11
Tak. Det ser rigtig godt ud. Jeg melder tilbage når jeg har afprøvet det, hvilket nok først bliver imorgen formiddag.
Avatar billede pfp Nybegynder
15. december 2008 - 16:20 #12
Hej.

Beklager at jeg fuldstændig har overset at vende tilbage på denne tråd. Spørgsmålet er nu så gammelt at jeg faktisk ikke kan huske hvilken løsning jeg endte op med at bruge.

Lægger i svar hvis I vil have point?
Avatar billede kalp Novice
15. december 2008 - 16:49 #13
=)
Avatar billede kalp Novice
15. december 2008 - 16:49 #14
doh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester