C# - generische Serialisierung utility-Klasse

Ich habe eine vorhandene Klasse zum serialisieren und Deserialisieren von Objekten auf/von XML. Es ist eine generische Klasse mit einem einzigen parameter vom Typ T deren einzige Einschränkung ist where T : IXmlSerializable. Ich möchte jedoch noch in der Lage sein, um diese Klasse zu verwenden, die auf Klassen, nicht umsetzen IXmlSerializable aber haben die [Serializable] Attribut. Wie könnte ich Sie gehen über das tun dies?

Aus meiner generische Klasse:

public static class XmlSerializationUtils<T> where T : IXmlSerializable
{
    public static T DeserializeXml(XmlDocument xml) { ... }
    public static XmlDocument SerializeToXml(T toSerialize) { ... }
}

Fand ich diese Diskussion aber es war keine Lösung gegeben, nur, dass ich nicht tun kann where T : Serializable. Versuchen zu tun where T : SerializableAttribute macht Visual Studio sagen "Nicht verwenden, versiegelte Klasse 'System.SerializableAttribute' als Typ-parameter-constraint".

Edit: basierend auf Stephen ' s Antwort, ich entfernt die Einschränkungen für XmlSerializationUtils<T> und ergänzt diese statische Konstruktor:

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"
        );
    }
}
Schreibe einen Kommentar