J'ai une classe existante pour la sérialisation et la désérialisation d'objets vers/depuis XML. C'est une classe générique avec un seul paramètre de type T
dont la seule contrainte est where T : IXmlSerializable
. Cependant, je veux toujours pouvoir utiliser cette classe sur les classes qui n'implémentent pas IXmlSerializable
mais qui ont l'attribut [Serializable]
. Comment pourrais-je faire cela?Classe d'utilitaire de sérialisation générique C#
de ma classe générique:
public static class XmlSerializationUtils<T> where T : IXmlSerializable
{
public static T DeserializeXml(XmlDocument xml) { ... }
public static XmlDocument SerializeToXml(T toSerialize) { ... }
}
J'ai trouvé this discussion mais il n'y avait pas de solution donnée, juste que je ne peux pas faire where T : Serializable
. Essayer de faire where T : SerializableAttribute
fait Visual Studio dire "Impossible d'utiliser la classe scellée 'System.SerializableAttribute' comme contrainte de paramètre de type".
Edit: basé sur Stephen's answer, je supprimé les restrictions sur XmlSerializationUtils<T>
et a ajouté ce constructeur statique:
static XmlSerializationUtils()
{
Type type = typeof(T);
bool hasAttribute = null != Attribute.GetCustomAttribute(type,
typeof(SerializableAttribute));
bool implementsInterface =
null != type.GetInterface(typeof(IXmlSerializable).FullName);
if (!hasAttribute && !implementsInterface)
{
throw new ArgumentException(
"Cannot use XmlSerializationUtils on class " + type.Name +
" because it does not have the Serializable attribute " +
" and it does not implement IXmlSerializable"
);
}
}
Ce n'est pas une solution déraisonnable. –
Ouais je suis d'accord, il est utilisé par un développeur qui sait si la classe qu'il essaie de sérialiser est sériable, s'il ne l'utilise pas correctement, vous ne pouvez pas éliminer tous les bogues posibles au moment de la compilation. –
@Ben: Nous ne pouvons pas toujours le faire, mais nous devrions certainement essayer d'attraper les bugs tôt et souvent. Dans ce cas, nous ne pouvons pas l'attraper au moment de la compilation, mais si nous utilisons l'astuce du constructeur statique, nous pouvons l'attraper au tout début de l'exécution (ce qui signifie qu'un contrôle de fumée post-compilation ne le manquera pas). –