J'ai une classe nommée que WebserviceType
j'ai obtenue de l'outil xsd.exe à partir d'un fichier XSD.
Maintenant, je veux désérialiser une instance d'un WebServiceType
objet en une chaîne. Comment puis-je faire ceci?
L' MethodCheckType
objet a comme paramètres un WebServiceType
tableau.
Mon premier essai était comme je l'avais sérialisé: avec a XmlSerializer
et a StringWriter
(pendant la sérialisation, j'ai utilisé a StringReader
).
C'est la méthode dans laquelle je sérialise l' WebServiceType
objet:
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;
Éditer:
Peut-être pourrais-je le dire en des termes différents: j'ai une instance de cet MethodCheckType
objet et d'autre part j'ai 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 prouver si les deux chaînes (des documents XML) sont identiques. C'est ce que je dois 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 en un MethodCheckType
objet.
la source
Réponses:
Voici la méthode de conversion pour les deux manières. 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 ; } }
la source
using
modèle ou uneDispose
méthode d' appel pour libérer correctement les ressources.using
? @KvanTTT?Je me rends compte que c'est un article très ancien, mais après avoir examiné la réponse de LB, j'ai réfléchi à la façon dont je pourrais améliorer la réponse acceptée et la rendre générique pour ma propre application. Voici ce que j'ai trouvé:
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 désormais être placées dans une classe d'assistance statique, ce qui signifie qu'aucune duplication de code vers chaque classe qui doit être sérialisée.
la source
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); } }
la source
C'est ma solution, pour tout objet de liste, vous pouvez utiliser ce code pour convertir en mise en page XML. KeyFather est votre balise principale 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(); } }
la source
public static class XMLHelper { /// <summary> /// Usage: var xmlString = XMLHelper.Serialize<MyObject>(value); /// </summary> /// <typeparam name="T">Kiểu dữ liệu</typeparam> /// <param name="value">giá trị</param> /// <param name="omitXmlDeclaration">bỏ qua declare</param> /// <param name="removeEncodingDeclaration">xóa encode declare</param> /// <returns>xml string</returns> public static string Serialize<T>(T value, bool omitXmlDeclaration = false, bool omitEncodingDeclaration = true) { if (value == null) { return string.Empty; } try { var xmlWriterSettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = omitXmlDeclaration, //true: remove <?xml version="1.0" encoding="utf-8"?> Encoding = Encoding.UTF8, NewLineChars = "", // remove \r\n }; var xmlserializer = new XmlSerializer(typeof(T)); using (var memoryStream = new MemoryStream()) { using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) { xmlserializer.Serialize(xmlWriter, value); //return stringWriter.ToString(); } memoryStream.Position = 0; using (var sr = new StreamReader(memoryStream)) { var pureResult = sr.ReadToEnd(); var resultAfterOmitEncoding = ReplaceFirst(pureResult, " encoding=\"utf-8\"", ""); if (omitEncodingDeclaration) return resultAfterOmitEncoding; return pureResult; } } } catch (Exception ex) { throw new Exception("XMLSerialize error: ", ex); } } private static string ReplaceFirst(string text, string search, string replace) { int pos = text.IndexOf(search); if (pos < 0) { return text; } return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); } }
la source