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"
);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verlangen, ein Attribut als Teil von Generika. Jedoch, Sie könnten einen statischen Konstruktor, der überprüft, ob es und wirft, wenn es nicht gefunden.
Können Sie überprüfen, um zu sehen, wenn ein Typ serialisierbar ist mit dem IsSerializable - Eigenschaft den Typ des Objekts.
Wie bereits erwähnt, ist dies nicht möglich, hinzuzufügen, als eine Allgemeine Einschränkung, aber wahrscheinlich werden daraufhin in einem Konstruktor.
IXmlSerializable
oder[Serializable]
gilt für die gegebene KlasseT
. TutIsSerializable
account für beide?Ich würde nur zu beseitigen, den Typ-Einschränkung und fangen die SerializationException, wenn der Typ nicht serialisieren oder Deserialisieren korrekt... In der Tat, damit können Sie Ihre generischen Serialisieren und Deserialisieren von Methoden zu akzeptieren formatter
könnten Sie kontrollieren, ob die Serialisierung ist Binär oder Xml -
IXmlSerializable
oder (mit Reflexion), war geschmückt mit der[Serializable]
Attribut... Dann WCF kam und Sie fügten hinzu, die[DataContract]
Attribut, die es erlaubt, auch eine Art zu sein, die als Xml serialisiert. So habe ich es entfernt...