Laden...

Generischer Typ soll serialisierbar sein

Erstellt von darefilz vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.614 Views
D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 15 Jahren
Generischer Typ soll serialisierbar sein

Hallo.

Ich habe folgendes Problem und komme einfach nicht wirklich weiter.
Ich habe ein generisches Interface. Ich will aber sicherstellen, dass der generische Typ serialisierbar ist.
Also habe ich sowas versucht:

interface I<T> where T : ISerializable

Das funktioniert aber irgendwie nur indirekt, da Klassen, die ISerializable implementieren nicht zwingend auch das SerializableAttribute haben müssen.
Also habe ich intuitiv das hier probiert.

interface I<T> where T : SerializableAttribute

Das funktioniert aber natürlich nicht, weil SerializableAttribute sealed ist.

Und jetzt weiß ich nicht weiter. 🙁
Hat von euch vielleicht einer einen Tipp für mich?

Grüße

S
248 Beiträge seit 2008
vor 15 Jahren

Hallo void,

interface I<T> where T : SerializableAttribute 

sagt nicht aus, dass T mit dem Attribut markiert ist sondern, dass es davon ableitet.
Die Bedingung die du ausdrücken möchtest ist so denke ich nicht möglich, aber vielleicht kennt sich da noch jemand besser aus.

Spo

F
101 Beiträge seit 2007
vor 15 Jahren

Das funktioniert aber irgendwie nur indirekt, da Klassen, die ISerializable implementieren nicht zwingend auch das SerializableAttribute haben müssen.

wenn der Programmierer versucht, ein typen zu serialisieren ohne den Typen mit Serializable zu flaggen, ist das dem seine schuld. von daher würd ich mich um solch sachen eher keine gedanken machen.

3.971 Beiträge seit 2006
vor 15 Jahren

Das funktioniert aber irgendwie nur indirekt, da Klassen, die ISerializable implementieren nicht zwingend auch das SerializableAttribute haben müssen.

Es gibt zwei Arten von Serialisation, einmal die über das Interface ISerializable, wo du alle Felder/Eigenschaften manuell als (de-)serialisierbar kennzeichnen musst und es gibt den einfachen Weg über entsprechende Meta-Daten von Klassen und Membern (Attribute).

Für die Prüfung ob, eine Klasse serialisierbar ist, musst du dich leider für eine Variante entscheiden. Bei ISerializable brauchst du nur das entsprechende Constraint hinzufügen. Nutzt du aber ausschließlich nur die entsprechenden Meta-Attribute, musst du im KOnstruktor deines generischen Typs prüfen, ob das entsprechende Attribute in deinem T gesetzt wurde (Reflection).

Tip, wenn es sich um ein nicht öffentliches Generic handelt, dann prüfe nur im DEBUG-Mode, ob das SerializableAttribute gesetzt wurde, bei einer public-Klasse musst du das leider immer prüfen, was (etwas) performanz verbraucht.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

D
darefilz Themenstarter:in
123 Beiträge seit 2004
vor 15 Jahren

Okay. Danke für die Antworten. Werde gucken, dass ich das Ganze etwas anders umsetze...