Ich suche nach einer einfachen Möglichkeit, um zu überprüfen, ob ein Objekt in C # serialisierbar ist.
Wie wir wissen, machen Sie ein Objekt serialisierbar, indem Sie entweder die ISerializable- Schnittstelle implementieren oder [Serializable] an die Spitze der Klasse setzen.
Was ich suche, ist eine schnelle Möglichkeit, dies zu überprüfen, ohne die Klasse widerspiegeln zu müssen, um ihre Attribute zu erhalten. Die Schnittstelle wäre schnell mit einer is- Anweisung.
Mit @ Flards Vorschlag ist dies der Code, den ich mir ausgedacht habe. Schrei, es gibt einen besseren Weg.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
Oder noch besser, holen Sie sich einfach den Typ des Objekts und verwenden Sie dann die IsSerializable-Eigenschaft für den Typ:
typeof(T).IsSerializable
Denken Sie daran, dass dies nur die Klasse zu sein scheint, mit der wir es zu tun haben, wenn die Klasse andere Klassen enthält, die Sie wahrscheinlich alle überprüfen oder versuchen möchten, zu serialisieren und auf Fehler zu warten, wie @pb hervorhob.
quelle
Antworten:
Sie haben ein schönes Grundstück in der
Type
Klasse namensIsSerializable
.quelle
Sie müssen alle Typen im Diagramm der zu serialisierenden Objekte auf das serialisierbare Attribut überprüfen. Am einfachsten ist es, das Objekt zu serialisieren und die Ausnahme abzufangen. (Aber das ist nicht die sauberste Lösung). Type.IsSerializable und das Überprüfen des serializalbe-Attributs berücksichtigen das Diagramm nicht.
Stichprobe
quelle
Dies ist eine alte Frage, die möglicherweise für .NET 3.5+ aktualisiert werden muss. Type.IsSerializable kann tatsächlich false zurückgeben, wenn die Klasse das DataContract-Attribut verwendet. Hier ist ein Ausschnitt, den ich benutze, wenn es stinkt, lass es mich wissen :)
quelle
null
überprüfen und zurückgeben, wenntrue
?Verwenden Sie Type.IsSerializable, wie andere darauf hingewiesen haben.
Es lohnt sich wahrscheinlich nicht zu versuchen, zu reflektieren und zu überprüfen, ob alle Elemente im Objektdiagramm serialisierbar sind.
Ein Mitglied könnte als serialisierbarer Typ deklariert werden, aber tatsächlich als abgeleiteter Typ instanziiert werden, der nicht serialisierbar ist, wie im folgenden erfundenen Beispiel:
Selbst wenn Sie feststellen, dass eine bestimmte Instanz Ihres Typs serialisierbar ist, können Sie daher im Allgemeinen nicht sicher sein, dass dies für alle Instanzen gilt.
quelle
Vermutlich beinhaltet Reflexion unter Wasser, aber der einfachste Weg?
quelle
Hier ist eine 3.5-Variante, die es allen Klassen mithilfe einer Erweiterungsmethode zur Verfügung stellt.
quelle
Ich habe die Antwort auf diese Frage und die Antwort hier genommen und sie so geändert, dass Sie eine Liste der Typen erhalten, die nicht serialisierbar sind. Auf diese Weise können Sie leicht erkennen, welche Sie markieren müssen.
Und dann nennst du es ...
Wenn es ausgeführt wird, hat nonSerializableTypes die Liste. Es gibt möglicherweise einen besseren Weg, dies zu tun, als eine leere Liste an die rekursive Methode zu übergeben. Jemand korrigiert mich, wenn ja.
quelle
Das Ausnahmeobjekt ist möglicherweise serialisierbar, verwendet jedoch eine andere Ausnahme, die dies nicht ist. Dies ist, was ich gerade mit WCF System.ServiceModel.FaultException hatte: FaultException ist serialisierbar, ExceptionDetail jedoch nicht!
Also benutze ich folgendes:
quelle
Meine Lösung in VB.NET:
Für Objekte:
Für Typen:
quelle