Dans une question précédente sur serialising an object to an XmlDocument
in C#, je devais sérialiser certaines informations de panne à un XmlDocument
qui a été renvoyé à partir d'un appel de service Web de style asmx. Sur le client, j'ai besoin de désérialiser le XmlDocument
retour à un objet.Sérialiser en XML et inclure le type de l'objet sérialisé
C'est assez simple si vous connaissez le type, mais j'ai réalisé que je voulais une approche flexible où le type à désérialiser est également codé dans le XmlDocument
. Je fais actuellement manuellement en ajoutant un XmlNode
au XmlDocument
qui a le nom du type, calculé comme suit:
Type type = fault.GetType();
string assemblyName = type.Assembly.FullName;
// Strip off the version and culture info
assemblyName = assemblyName.Substring(0, assemblyName.IndexOf(",")).Trim();
string typeName = type.FullName + ", " + assemblyName;
Puis sur le client, j'obtiens d'abord ce nom de type retour de la XmlDocument
, et créer le type objet qui est passé dans le XmlSerialiser
ainsi:
object fault;
XmlNode faultNode = e.Detail.FirstChild;
XmlNode faultTypeNode = faultNode.NextSibling;
// The typename of the fault type is the inner xml of the first node
string typeName = faultTypeNode.InnerXml;
Type faultType = Type.GetType(typeName);
// The serialised data for the fault is the second node
using (var stream = new StringReader(faultNode.OuterXml))
{
var serialiser = new XmlSerializer(faultType);
objectThatWasSerialised = serialiser.Deserialize(stream);
}
return (CastToType)fault;
C'est donc une approche force brute, et je me demandais s'il y a une solution plus élégante qui comprend en quelque sorte le typename du type sérialisé automatiquement, au lieu d'enregistrer manuellement ailleurs ailleurs?
+1 pour fournir un bon code de copie/collage et rendre ma vie un peu plus facile. – Phil