Vad jag vill kunna göra är att ändra elementnamnet specialItem i XML-filen till något annat utan att behöva ändra namn på klassen. Det fungerar ju utmärkt på properties med [XmlElement("blahablaha")], men inte på klassen... Hur göra?
Jag testade att bara serialisera ett objekt och inte hela min samling och då fungerar det alldeles utmärkt. men det hjälper ju inte eftersom det är hela min samling som jag ska serialisera ;)
Namespacet syns i xml-filen men roten blir den samma, dvs oförändrad. Verkar som att taggen för rotnamnet skrivs över när jag serialiserar min samling. Har kollat lite på AttributeOverrides som kanske kan lösa det hela...
Hmm nu har jag även försökt med AttributeOverrrides utan resultat. Den som kommer på en lösning av problemet, utan att byta namn på klassen, är värd en guldstjärna :)
Nu ska vi se här. Anledningen är nog så pass enkel att du inte får något rot-element när du serialiserar en hel samling av objekt. Jag gissar på att din XML-fil ser ut så här:
Eftersom att ett XML-dokument inte kan innehålla rotelementet flera gånger. Det känns spontant som att du först får kapsla in din kollektion i en egen klass som ärver från Collection, istället för att använda generics. Troligtvis omständigt. ;)
När jag specificerar roten på mitt SpecialItem-objekt så fungerar det om jag bara serialiserar detta. Serialiserar jag däremot hela min samling av typen Collection<SpecialItem> så ingoreras rot-attributet för ett SpecialItem och blir automagiskt namnet på klassen. Det är alltså rot-elementet på ett item-objekt jag vill ändra, inte rot-elementet på XML-filen (inte just nu i alla fall).
Det känns som jag nått en dead-end, vill helst inte behöva ändra namnet på klassen vars objekt-instanser sparas i samlingen.
Nope verkar inte finnas någon riktigt smidig lösning på det här problemet, vilket är synd då XmlSerializer är smidig på många sätt. Det får bli att använda XmlTextWriter istället, där jag har mer kontroll över det XML-dokument som ska genereras.
Äntligen hittade jag en lösning som jag kan leva med och det visade sig bli en mix av XmlTextWriter och XmlSerializer :e
Istället för att serializera hela min collection så skapar jag huvudet/foten av XML-dokumentet med XmlTextWriter. Jag går sedan igenom hela min samling med items med en foreach och serialiserar varje objekt, ett efter ett.
using (XmlTextWriter xmlWriter = new XmlTextWriter("C:\\test.xml", Encoding.UTF8))
{
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("En sträng");
xmlWriter.WriteStartElement("Ännu en sträng");
XmlSerializer xmlSerializer = new XmlSerializer(typeof(SpecialItem));
foreach (SpecialItem item in SpecialItems)
xmlSerializer.Serialize(xmlWriter, item);
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
}
Tack SPiN för ditt engagemang (y)
423 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25