Je recherche un moyen simple de vérifier si un objet en C # est sérialisable.
Comme nous le savons, vous rendez un objet sérialisable en implémentant l' interface ISerializable ou en plaçant le [Serializable] en haut de la classe.
Ce que je recherche, c'est un moyen rapide de vérifier cela sans avoir à refléter la classe pour obtenir ses attributs. L'interface serait rapide en utilisant une instruction is .
En utilisant la suggestion de @ Flard, c'est le code que j'ai trouvé, criez qu'il y a un meilleur moyen.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
Ou mieux encore, obtenez simplement le type de l'objet, puis utilisez la propriété IsSerializable sur le type:
typeof(T).IsSerializable
Rappelez-vous bien que cela ne semble concerner que la classe à laquelle nous avons affaire si la classe contient d'autres classes que vous voulez probablement toutes vérifier ou essayer de sérialiser et attendre les erreurs comme @pb l'a souligné.
la source
Réponses:
Vous avez une belle propriété sur la
Type
classe appeléeIsSerializable
.la source
Vous allez devoir vérifier tous les types dans le graphique des objets sérialisés pour l'attribut sérialisable. Le moyen le plus simple est d'essayer de sérialiser l'objet et d'attraper l'exception. (Mais ce n'est pas la solution la plus propre). Type.IsSerializable et la vérification de l'attribut serializalbe ne prennent pas en compte le graphe.
Échantillon
la source
Il s'agit d'une ancienne question qui devra peut-être être mise à jour pour .NET 3.5+. Type.IsSerializable peut en fait retourner false si la classe utilise l'attribut DataContract. Voici un extrait que j'utilise, si ça pue, faites le moi savoir :)
la source
null
vérification et retourner sitrue
?Utilisez Type.IsSerializable comme d'autres l'ont souligné.
Cela ne vaut probablement pas la peine d'essayer de réfléchir et de vérifier si tous les membres du graphe d'objets sont sérialisables.
Un membre peut être déclaré en tant que type sérialisable, mais en fait être instancié en tant que type dérivé qui n'est pas sérialisable, comme dans l'exemple artificiel suivant:
Par conséquent, même si vous déterminez qu'une instance spécifique de votre type est sérialisable, vous ne pouvez pas en général être sûr que cela sera vrai pour toutes les instances.
la source
Implique probablement une réflexion sous l'eau, mais le moyen le plus simple?
la source
Voici une variante 3.5 qui la rend disponible à toutes les classes en utilisant une méthode d'extension.
la source
J'ai pris la réponse à cette question et la réponse ici et je l'ai modifiée pour que vous obteniez une liste des types qui ne sont pas sérialisables. De cette façon, vous pouvez facilement savoir lesquels marquer.
Et puis vous l'appelez ...
Lorsqu'il s'exécute, nonSerializableTypes aura la liste. Il peut y avoir une meilleure façon de faire cela que de passer une liste vide à la méthode récursive. Quelqu'un me corrige si oui.
la source
L'objet d'exception peut être sérialisable, mais en utilisant une autre exception qui ne l'est pas. C'est ce que je viens d'avoir avec WCF System.ServiceModel.FaultException: FaultException est sérialisable mais ExceptionDetail ne l'est pas!
J'utilise donc ce qui suit:
la source
Ma solution, dans VB.NET:
Pour les objets:
Pour les types:
la source