Entwickler-Ecke

IO, XML und Registry - Warum kann diese Klasse nicht serialisiert werden?


C# - Mi 25.01.12 21:04
Titel: Warum kann diese Klasse nicht serialisiert werden?
Hey Leute,

Ich habe vor kurzem schon mal das Problem in einem anderen Thread gehabt, dass ich meine Klasse nicht Serialisieren kann: Fehler bei Reflektion.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    public class DataFile
    {
        public DataFile()
        {
            Users = new List<User>();
            Files = new List<FileInfo>();
        }

        public string FilePath;
        public string Password;
        public int TextColorArgb;
        public string Name;
        public List<User> Users;
        public List<FileInfo> Files;
        public bool Autorun;
    }


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public void SaveData()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(DataFile), new[] { typeof(FileInfo), typeof(UserData) });
            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true,
                IndentChars = "\t"
            };
            XmlWriter writer = XmlWriter.Create("Data.xml", settings);
            serializer.Serialize(writer, this);
            writer.Close();
        }


weiß jemand wo zum Teufel jetzt das Problem liegt?


Ralf Jansen - Mi 25.01.12 21:16

Ist FileInfo die Klasse aus dem Framework (die aus System.IO)? Dann ist die nicht serialisierbar weil die keinen Standard Konstruktor hat.

Andere Klasse aber absolut gleiches Problem wie in dem anderen Thread. Da du das Problem schon kanntest sollte es eigentlich für dich nicht zu schwer sein das für die beteiligten Klassen in der Doku nachzusehen.


C# - Mi 25.01.12 21:20

Nein FileInfo ist hier eine eigene Klasse.
Natürlich.
In diesem Moment fällt mir der Fehler ein xD. Meine User Klasse ist von TcpClient abgeleitet. Dafür muss ich die Klasse UserInfo nehmen xD.
Die hab ich nämlich extra dafür gemacht...
*Peinlich*
:autsch: :autsch: :autsch:


Ralf Jansen - Mi 25.01.12 21:24

In dem Fall, wenn du dich einfach nur Blöd angestelt hast ;), ziehe ich die angedeutete RTFM Kritik in meinem letzten Satz zurück.


C# - Mi 25.01.12 21:33

danke ;)
oh man und bei der serializer deklaration steht auch noch typeof(UserData)...
:autsch:


Yogu - Mi 25.01.12 23:03

Man merke: Nenne eine Klasse, die mit Netzwerkprotokollen umgehen kann, nicht User, sondern z.B. UserDataProvider. User sieht nämlich tatsächlich nach einem Objekt aus, das Daten speichert und vielleicht Informationen geben kann, nicht aber nach einem, das selbstständig kommunizieren kann. Überhaupt ist es an dieser Stelle nicht unbedingt sinnvoll, von TcpClient abzuleiten, da ein Benutzer im Normalfall keine Spezialisierung eines Tcp-Clients darstellt. Wenn überhaupt, sollte er einen TcpClient verwenden.

Soviel zu Softwaredesign. Hab bisher allerdings weder kommerziell gearbeitet, noch mit dem Studium begonnen. Also alles ohne Gewähr :mrgreen: