Comment XML Sérialiser un 'Type'
Comment sérialiser un "Type"?
Je veux sérialiser XML un objet qui a une propriété qui est un type d'un objet. L'idée est que, lorsqu'il est désérialisé je peux créer un objet de ce type.
public class NewObject
{
}
[XmlRoot]
public class XmlData
{
private Type t;
public Type T
{
get { return t; }
set { t = value; }
}
}
static void Main(string[] args)
{
XmlData data = new XmlData();
data.T = typeof(NewObject);
try
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
try
{
using (FileStream fs = new FileStream("test.xml", FileMode.Create))
{
serializer.Serialize(fs, data);
}
}
catch (Exception ex)
{
}
}
catch (Exception ex)
{
}
}
- Je obtenir cette exception:
"Le type ConsoleApplication1.NewObject n'était pas prévu. Utiliser le XmlInclude ou SoapInclude attribut pour spécifier les types qui ne sont pas connus de manière statique."
Où dois-je mettre le [XmlInclude]? Est-ce même possible?
source d'informationauteur Robert
Vous devez vous connecter pour publier un commentaire.
La sérialisation XML sérialise uniquement les champs publics et valeurs de propriété d'un objet dans un flux XML. La sérialisation XML ne pas inclure des informations de type. Par exemple, si vous avez un Livre objet qui existe dans la Bibliothèque de l'espace de noms, il n'y a aucune garantie qu'il sera désérialiser un objet de même type.
Source: MSDN: présentation de la Sérialisation XML
Type
classe ne peut pas être sérialisé, carSystem.RuntimeType
n'est pas accessible à notre code, c'est un type CLR. Vous pouvez contourner ce problème en utilisant le type de nom au lieu de cela, comme ceci:Vous pourriez potentiellement mettre en œuvre les
IXmlSerializable
interface et l'utilisationType.FullName
(vous pouvez aussi avoir besoinType.AssemblyQualifiedName
) pour la sérialisation et laAssembly.GetType(string)
pour la désérialisation de votre type d'élément.J'ai fini de convertir le Type de nom d'une chaîne à enregistrer au format XML.
Lors de la désérialisation, je charge toutes les Dll et d'enregistrer le nom du type et le type dans un dictionnaire. Lorsque je charge le XML avec le Nom du Type, je peux chercher le nom dans le dictionnaire de la clé et de connaître le type de la valeur de dictionnaire.
Le problème est que le type de XmlData.T est en fait "le Système de.RuntimeType" (une sous-classe de Type), qui, malheureusement, n'est pas public. Cela signifie qu'il n'est pas possible de dire la serialise quels types d'attendre. Je suggère seulement de la sérialisation du nom du type ou nom pleinement qualifié comme Jay Bazuzi suggère.
Laid, mais il fonctionne. Faire une Classe qui comprend le type d'objet et la chaîne sérialisée.
ex