Avatar billede Slettet bruger
03. juni 2010 - 22:41 Der er 17 kommentarer og
1 løsning

Serialize af base collection

Jeg har følgende custom collection:



[Serializable]
public class TitleCollection : EventCollection<Title>, ICloneable, INotifyCollectionChanged
{
    private TitleType titleTypes;

    public TitleType TitleTypes
...   


Denne collection eksistere i to instancer på et overliggende objekt:



[Serializable]
public class Subtitle : ICloneable, INotifyPropertyChanging, INotifyPropertyChanged
{
  private TitleCollection sourceTitles;
  private TitleCollection translatedTitles;
...



Men når jeg serialisere Subtitle klassen, får jeg kun følgende:

<Subtitle>
  <SourceTitles>
      <TitleTypes>Source</TitleTypes>
  </SourceTitles>
  <TranslatedTitles>
      <TitleTypes>Translated</TitleTypes>
  </TranslatedTitles>
</Subtitle>


Jeg mangler altså indeholde af min base klasse i title collection, hvordan får jeg det med?
Avatar billede Syska Mester
03. juni 2010 - 23:33 #1
Er base class også Serializable ?
Avatar billede Syska Mester
03. juni 2010 - 23:33 #2
Er base class også serializable ?
Avatar billede Syska Mester
03. juni 2010 - 23:34 #3
ARGHHH, exp og deres cache virker af ************ til ... god damn.
Avatar billede Slettet bruger
03. juni 2010 - 23:51 #4
Hehe. Ja mener jeg at den er. Er lige på mobileone.
Avatar billede Syska Mester
04. juni 2010 - 00:17 #5
complex types skal have serializable attribute på mener jeg at have rodet med engang.
Avatar billede arne_v Ekspert
04. juni 2010 - 01:08 #6
Kan du vise lidt mere kode?
Avatar billede Slettet bruger
04. juni 2010 - 18:15 #7
Her er in TitleCollection:
http://pastebin.com/XKzP3CQV

Og EventCollection:
http://pastebin.com/EmwEQNP5

Og Title klassen:
http://pastebin.com/6gkpSH50


Jeg har undladt en del kode for overskuelighedens skyld :)
Avatar billede Syska Mester
05. juni 2010 - 00:36 #8
Pas, her tror jeg du må tage over Arne_v ... synes ikke jeg kan se noget.
Avatar billede arne_v Ekspert
05. juni 2010 - 04:11 #9
Hm.

XML serialization serialiserer alle public propertys.

Har en TitleCollection andre propertys end TitleTypes?
Avatar billede Slettet bruger
05. juni 2010 - 09:21 #10
Nej det har den ikke.
Avatar billede arne_v Ekspert
05. juni 2010 - 15:27 #11
Saa er det jo korrekt at kun TitleTypes bliver gemt ved XML serialisering.

Enten maa du lave nogle properties til resten af data som du vil have serialiseret eller så må du lave en custom serialisering.
Avatar billede Slettet bruger
05. juni 2010 - 19:42 #12
Men det er da mærkeligt at fordi jeg laver min egen collection, så virker det ikke. Hvordan virker en almindelig collection så? Når jeg arver,burde det vel være ens.
Avatar billede arne_v Ekspert
05. juni 2010 - 22:07 #13
XML serializeren gør noget specielt for klasser som extender IEnumerable.

Det gør standard collections.

Det gør din klasse ikke.
Avatar billede arne_v Ekspert
05. juni 2010 - 22:07 #14
Kode som illustrerer diverse pointer:

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;

namespace E
{
    public class Data1
    {
        private int v1;
        private int v2;
        private int v3;
        public Data1() : this(0, 0, 0)
        {
        }
        public Data1(int v1, int v2, int v3)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
        public int V1
        {
            get { return v1; }
            set { v1 = value; }
        }
        public int V2
        {
            get { return v2; }
        }
    }
    public class Data2 : IXmlSerializable
    {
        private int v1;
        private int v2;
        private int v3;
        public Data2() : this(0, 0, 0)
        {
        }
        public Data2(int v1, int v2, int v3)
        {
            this.v1 = v1;
            this.v2 = v2;
            this.v3 = v3;
        }
        public int V1
        {
            get { return v1; }
            set { v1 = value; }
        }
        public int V2
        {
            get { return v2; }
        }
        public XmlSchema GetSchema()
        {
            return null;   
        }
        public void ReadXml(XmlReader rdr)
        {
            throw new NotImplementedException("Arne forgot to add deserialization");
        }
        public void WriteXml(XmlWriter wrt)
        {
            wrt.WriteStartElement("V1");
            wrt.WriteString(v1.ToString());
            wrt.WriteEndElement();
            wrt.WriteStartElement("V2");
            wrt.WriteString(v2.ToString());
            wrt.WriteEndElement();
            wrt.WriteStartElement("V3");
            wrt.WriteString(v3.ToString());
            wrt.WriteEndElement();
        }
    }
    public class List4<T>
    {
        private List<T> real = new List<T>();
        public void Add(T o)
        {
            real.Add(o);
        }
    }
    public class List5<T> : IEnumerable<T>
    {
        private List<T> real = new List<T>();
        public void Add(T o)
        {
            real.Add(o);
        }
        public IEnumerator<T> GetEnumerator()
        {
            return real.GetEnumerator();
        }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            throw new NotImplementedException("Arne forgot to add old style enumerator");
        }
    }
    public class Program
    {
        public static void AnySer<T>(T o)
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            ser.Serialize(Console.Out, o);
        }
        public static void Main(string[] args)
        {
            Data1 o1 = new Data1(1, 2, 3);
            AnySer(o1);
            Data2 o2 = new Data2(1, 2, 3);
            AnySer(o2);
            List<string> lst3 = new List<string>();
            lst3.Add("A");
            lst3.Add("BB");
            lst3.Add("CCC");
            AnySer(lst3);
            List4<string> lst4 = new List4<string>();
            lst4.Add("A");
            lst4.Add("BB");
            lst4.Add("CCC");
            AnySer(lst4);
            List5<string> lst5 = new List5<string>();
            lst5.Add("A");
            lst5.Add("BB");
            lst5.Add("CCC");
            AnySer(lst5);
            Console.ReadKey();
        }
    }
}
Avatar billede Slettet bruger
07. juni 2010 - 15:09 #15
Så hvis min custom collection implementerede IEnumerable ville det måske virke korrekt?
Avatar billede arne_v Ekspert
07. juni 2010 - 15:12 #16
Ja
Avatar billede Slettet bruger
07. juni 2010 - 15:52 #17
Amen altså, det virker perfekt!

Arne, smid et svar - og mange tak!
Avatar billede arne_v Ekspert
07. juni 2010 - 16:07 #18
svar
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