J'ai une classe nommée WebserviceType
que j'ai obtenue de l'outil xsd.exe à partir d'un fichier XSD.
Maintenant, je veux désérialiser une instance d'un objet WebServiceType
en chaîne. Comment puis-je faire ceci?
L'objet MethodCheckType
a pour paramètres un tableau WebServiceType
.
Mon premier essai a été comme si je l'avais sérialisé: avec un XmlSerializer
et un StringWriter
(lors de la sérialisation, j'ai utilisé un StringReader
).
Voici la méthode dans laquelle je sérialise l'objet WebServiceType
:
XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
MethodCheckType output = null;
StringReader reader = null;
// catch global exception, logg it and throw it
try
{
reader = new StringReader(path);
output = (MethodCheckType)serializer.Deserialize(reader);
}
catch (Exception)
{
throw;
}
finally
{
reader.Dispose();
}
return output.WebService;
Modifier:
Peut-être que je pourrais le dire avec des mots différents: j'ai une instance de cet objet MethodCheckType
et, en revanche, le document XML à partir duquel j'ai sérialisé cet objet. Maintenant, je veux convertir cette instance en un document XML sous la forme d'une chaîne. Après cela, je dois vérifier si les deux chaînes (de documents XML) sont identiques. Je dois le faire, car je fais des tests unitaires de la première méthode dans laquelle je lis un document XML dans un StringReader
et le sérialise dans un objet MethodCheckType
.
Voici une méthode de conversion pour les deux méthodes . This = instance de votre classe
public string ToXML()
{
using(var stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(stringwriter, this);
return stringwriter.ToString();
};
}
public static YourClass LoadFromXMLString(string xmlText)
{
using(var stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(YourClass ));
return serializer.Deserialize(stringReader) as YourClass ;
};
}
Je réalise que c'est un très vieux billet, mais après avoir examiné la réponse de L.B, j'ai réfléchi à la manière d'améliorer la réponse acceptée et de la rendre générique pour ma propre application. Voici ce que je suis venu avec:
public static string Serialize<T>(T dataToSerialize)
{
try
{
var stringwriter = new System.IO.StringWriter();
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stringwriter, dataToSerialize);
return stringwriter.ToString();
}
catch
{
throw;
}
}
public static T Deserialize<T>(string xmlText)
{
try
{
var stringReader = new System.IO.StringReader(xmlText);
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
catch
{
throw;
}
}
Ces méthodes peuvent maintenant être placées dans une classe d'assistance statique, ce qui signifie aucune duplication de code pour chaque classe devant être sérialisée.
public static string Serialize(object dataToSerialize)
{
if(dataToSerialize==null) return null;
using (StringWriter stringwriter = new System.IO.StringWriter())
{
var serializer = new XmlSerializer(dataToSerialize.GetType());
serializer.Serialize(stringwriter, dataToSerialize);
return stringwriter.ToString();
}
}
public static T Deserialize<T>(string xmlText)
{
if(String.IsNullOrWhiteSpace(xmlText)) return default(T);
using (StringReader stringReader = new System.IO.StringReader(xmlText))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
Ceci est ma solution, pour tout objet de liste, vous pouvez utiliser ce code pour convertir en mise en page XML. KeyFather est votre tag principal et KeySon est le point de départ de votre Forech.
public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
{
var settings = new XmlWriterSettings
{
Indent = true
};
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement(keyFather);
foreach (var objeto in anyObject)
{
writer.WriteStartElement(keySon);
foreach (PropertyDescriptor item in props)
{
writer.WriteStartElement(item.DisplayName);
writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
}
writer.WriteFullEndElement();
writer.WriteEndDocument();
writer.Flush();
return builder.ToString();
}
}