2009-03-17 5 views
2

Ich bin durch die Sitzungsschlüssel durchschleifen und Einträge und ihre Werte zu einer Hashtable hinzufügen, die ich dann serialisieren. Das Problem, das ich habe, ist, dass es ein Objekt in der Sitzung gibt, das nicht serialisierbar ist, und es sollte sowieso nicht serialisiert werden. Ich bin auf der Suche um, und viele eingebauten Typen haben die ISerializable Attribut nicht implementieren, so dass für die Prüfung nicht funktioniert:Wie kann ich feststellen, ob eine Klasse serialisiert werden kann?

if (val is ISerializable) 
{ 
    ... 
} 

Also, wie kann ich testen das? Macht das Sinn?

Antwort

10

Es gibt nur einen garantierten Weg festzustellen, ob ein Objekt serialisierbar ist. Serialisieren Sie es und sehen Sie, ob der Vorgang erfolgreich ist.

Ich weiß, dass scheint ein bisschen übertrieben, aber es gibt nur so viele verschiedene Möglichkeiten, die Serialisierung kann gebrochen werden. Es gibt zwei Elemente in Metadaten, die Sie überprüfen können, um festzustellen, ob ein Typ die Serialisierbarkeit (ISerializable und [Serializable]) beansprucht, aber dies ist nur ein Anspruch. Es kann und wird auf so viele verschiedene Arten gebrochen.

Das Problem ist, dass in der .NET-Welt der Akt der Erklärung der Fähigkeit, Serialisierung und tatsächlich Serialisierung werden zwei separate Aktionen sind. Es ist durchaus möglich (und legal), einen zu tun, aber nicht den anderen. Nehmen Sie dies zum Beispiel

[Serializable] 
public class Foo { 
    public Object Field1; 
} 

Diese Klasse beansprucht Serialisierung und kann sehr gut sein. Alles hängt von dem Wert ab, der tatsächlich in Field1 gespeichert wird. Keine Menge von Metadaten-Inspektionen auf dem Typ wird Ihnen jeden sagen, ob es tatsächlich serialisiert werden kann. Alles, was Sie tun können, ist zu versuchen, zu sehen, ob es gelingt.

+0

Serialisierung klingt wie ein Overkill. Einige Leute benutzen die Serialisierung für das Klonen :-) ... Eine erfolgreiche Serialisierung garantiert auf jeden Fall keinen Erfolg beim nächsten Mal. –

+0

@Toro, nein, tut es nicht. Es sagt Ihnen nur, ob das Objekt am Serialisierungspunkt serialisierbar war. Ich denke nicht, dass es Overkill ist, weil es keinen anderen Weg gibt, den du versuchst. – JaredPar

+0

Ich würde [Serializable] verwenden und dann eine Ausnahme behandeln, wenn es fehlschlägt. Du musst das ziemlich genau so machen. Zumindest, wenn es nicht als serialisierbar gekennzeichnet ist, können Sie es vermeiden, es zu versuchen. –

-1

Überprüfen Sie dasselbe, das CRL verwenden würde: das [Serializable] Attribut.

+0

Funktioniert nicht. Sie können dieses Attribut haben und immer noch nicht serialisiert werden – JaredPar

+0

Sicher, erfolgreiche Serialisierung garantiert keinen Erfolg beim nächsten Mal. –

0

Sie können die IsSerializable-Eigenschaft der Type-Klasse verwenden.

if(val.GetType().IsSerializable) 
+0

Funktioniert nicht. Ich kann behaupten, serialisierbar zu sein, aber bei der Serialisierung fehlschlagen. – JaredPar

+0

Und es scheint nur [Serializable] zu überprüfen und nicht: ISerializable –