Wie kann ich eine Art Einschränkung zu enthalten, was serialisierbar eine generische Methode?
Meine generische Methode serialisieren muss das übergebene Objekt jedoch nur darauf, dass es ISerializable implementiert scheint nicht zu funktionieren. Zum Beispiel habe ich ein struct zurückgegeben, die von einem web-service (markiert mit SerializableAttribute), der serialisiert in xml ganz gut, aber, wie erwartet, die C# - compiler beschwert sich.
Gibt es einen Weg wie ich überprüfen kann das Objekt serialisierbar ist, bevor Sie versuchen, es zu serialisieren, oder, noch besser, eine Möglichkeit, die where
keyword zu prüfen, das Objekt ist geeignet?
Hier meine komplette Methode:
public static void Push<T>(string url, T message)
where T : ISerializable
{
string xml = SerializeMessage(message);
//Send the message to Amazon SQS
SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
client.SendMessage(sendReq);
}
Und SerializeMessage:
private static string SerializeMessage<T>(T message)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (StringWriter stringWriter = new StringWriter())
{
xmlSerializer.Serialize(stringWriter, message);
return stringWriter.ToString();
}
}
Falls dies nicht möglich ist, was ist der beste Weg, um eine überprüfung durchführen, dass ein Objekt serialisierbar ist zur Laufzeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht tun, diese völlig über generische constraints, aber Sie können ein paar Dinge helfen:
1) Setzen Sie die new() Einschränkung auf den generischen Typ (zum aktivieren der Fähigkeit zu Deserialisieren und zu gewährleisten, die die XmlSerializer-nicht Klagen über einen Mangel an Standard-ctor):
2) Auf die erste Zeile in der Methode, Umgang mit der Serialisierung (oder Konstruktor oder sonst wo Sie nicht haben, zu wiederholen, über und über), können Sie dies überprüfen:
Natürlich gibt es immer noch die Möglichkeit, runtime-Ausnahmen, wenn Sie versuchen zu serialisieren eines geben, aber diese decken die offensichtlichsten Probleme.
Schrieb ich eine Länge von blog-Artikel zu diesem Thema, die Sie vielleicht nützlich finden. Um die es hauptsächlich geht in die binäre Serialisierung, aber die Konzepte sind anwendbar auf die meisten Serialisierungsformat.
Die lange und die kurze davon ist
Der einzige Weg zu wissen, ob ein Objekt serialisierbar ist, zu versuchen, es zu serialisieren.
In der Tat, Sie fragten, wie Sie sagen, wenn ein Typ "serializable", aber die eigentliche Frage wird mit Bezug auf Objekte. Einige Instanzen eines Typs kann nicht serialisierbar sein, auch wenn der Typ gekennzeichnet ist [Serializable]. Was zum Beispiel, wenn die Instanz enthält Zirkelbezüge?
Statt
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
versuchen
XmlSerializer xmlSerializer = new XmlSerializer(Nachricht.GetType());