Sérialisation SANS xmlns

J’ai plusieurs méthodes d’extension qui gèrent la sérialisation de mes classes et, comme il peut prendre beaucoup de temps, elles sont créées une fois par classe et dissortingbuées par cette méthode.

public static XmlSerializer GetSerializerFor(Type typeOfT) { if (!serializers.ContainsKey(typeOfT)) { var xmlAtsortingbutes = new XmlAtsortingbutes(); var xmlAtsortingbuteOverrides = new XmlAtsortingbuteOverrides(); System.Diagnostics.Debug.WriteLine(ssortingng.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT)); xmlAtsortingbutes.Xmlns = false; xmlAtsortingbuteOverrides.Add(typeOfT, xmlAtsortingbutes); var newSerializer = new XmlSerializer(typeOfT, xmlAtsortingbuteOverrides); serializers.Add(typeOfT, newSerializer); } return serializers[typeOfT]; } 

Ceci est appelé par la méthode d’extension .Serialize ()

 public static XElement Serialize(this object source) { try { var serializer = XmlSerializerFactory.GetSerializerFor(source.GetType()); var xdoc = new XDocument(); using (var writer = xdoc.CreateWriter()) { serializer.Serialize(writer, source, new XmlSerializerNamespaces(new[] { new XmlQualifiedName("", "") })); } return (xdoc.Document != null) ? xdoc.Document.Root : new XElement("Error", "Document Missing"); } catch (Exception x) { return new XElement("Error", x.ToSsortingng()); } } 

Malheureusement, lors de la XmlTypeAtsortingbute(Namespace="http://tempuri.org/") automatique des classes, l’atsortingbut XmlTypeAtsortingbute(Namespace="http://tempuri.org/") appliqué.

Cela entraîne l’échec de la désérialisation par les homologues non générés automatiquement.

J’ai besoin du sérialiseur pour ignorer complètement et ne pas appliquer l’espace de noms, mais ce que j’ai écrit dans le premier bloc de code ne semble pas l’enlever, je finis toujours avec xml comme ceci

  12  1234 Associate false  2010-06-22T09:38:01.5024351-05:00 This is an update  

Au lieu de la même chose, moins l’atsortingbut xmlns="http://tempuri.org/" .

S’il vous plaît aider, merci, cela me rend fou!

MODIFIER:

Je connais le problème, mais pas comment le résoudre.

Ma classe n’est pas seulement pleine de types simples.

Il contient des propriétés avec des types d’autres classes. Qui sont également générés automatiquement avec l’ XmlTypeAtsortingbute(Namespace = "http://tempuri.org/") . Donc, ce qui se passe, c’est que lorsque la sérialisation se produit et que les propriétés de ma classe sont sérialisées, elles ne passent pas par ma sérialisation personnalisée et, par conséquent, l’atsortingbut est appliqué et non remplacé.

Maintenant, je dois juste comprendre comment sauter ce cerceau. Des idées sur comment?

EDIT 2:

Ce qui suit fonctionne pour sérialiser SANS xmlns … mais j’ai un problème de fin de désérialisation, mais je ne sais pas encore si c’est lié ou non.

 public static XmlSerializer GetSerializerFor(Type typeOfT) { if (!serializers.ContainsKey(typeOfT)) { var xmlAtsortingbutes = new XmlAtsortingbutes(); var xmlAtsortingbuteOverrides = new XmlAtsortingbuteOverrides(); System.Diagnostics.Debug.WriteLine(ssortingng.Format("XmlSerializerFactory.GetSerializerFor(typeof({0}));", typeOfT)); xmlAtsortingbutes.XmlType = new XmlTypeAtsortingbute { Namespace = "" }; xmlAtsortingbutes.Xmlns = false; var types = new List {typeOfT, typeOfT.BaseType}; foreach (var property in typeOfT.GetProperties()) { types.Add(property.PropertyType); } types.RemoveAll(t => t.ToSsortingng().StartsWith("System.")); foreach (var type in types) { xmlAtsortingbuteOverrides.Add(type, xmlAtsortingbutes); } var newSerializer = new XmlSerializer(typeOfT, xmlAtsortingbuteOverrides); //var newSerializer = new XmlSerializer(typeOfT, xmlAtsortingbuteOverrides, extraTypes.ToArray(), new XmlRootAtsortingbute(), ssortingng.Empty); //var newSerializer = new XmlSerializer(typeOfT, ssortingng.Empty); serializers.Add(typeOfT, newSerializer); } return serializers[typeOfT]; } 

EDIT3: Utilisation de la solution de Comment supprimer tous les espaces de noms de XML avec C #?

 public static XElement RemoveAllNamespaces(this XElement source) { return !source.HasElements ? new XElement(source.Name.LocalName) { Value = source.Value } : new XElement(source.Name.LocalName, source.Elements().Select(el => RemoveAllNamespaces(el))); } 

Aucun problème – transmettez simplement une chaîne vide en tant qu’espace de nom par défaut au sérialiseur XML:

 XmlSerializer newSerializer = new XmlSerializer(typeOfT, ""); 

Malheureusement, il n’y a pas de surcharge de constructeur facile si vous avez vraiment besoin de définir XmlAtsortingbuteOverrides et l’espace de noms par défaut. Vous pouvez donc ignorer XmlAtsortingbuteOverrides et utiliser le constructeur que j’ai mentionné ou utiliser celui qui définit tous les parameters possibles (y compris XmlAtsortingbuteOverrides et espaces de noms XML par défaut – et quelques autres).

Une solution de travail, pour l’enregistrement!

 var ns = new XmlSerializerNamespaces(); ns.Add("", ""); var serializer = new XmlSerializer(yourType); serializer.Serialize(xmlTextWriter, someObject, ns); 
  public static byte[] SerializeByteByType(object objectToSerialize, Type type) { XmlWriterSettings xmlSetting = new XmlWriterSettings() { NewLineOnAtsortingbutes = false, OmitXmlDeclaration = true, Indent = false, NewLineHandling = NewLineHandling.None, Encoding = Encoding.UTF8, NamespaceHandling = NamespaceHandling.OmitDuplicates }; using (MemoryStream stm = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(stm, xmlSetting)) { var xmlAtsortingbutes = new XmlAtsortingbutes(); var xmlAtsortingbuteOverrides = new XmlAtsortingbuteOverrides(); xmlAtsortingbutes.Xmlns = false; xmlAtsortingbutes.XmlType = new XmlTypeAtsortingbute() { Namespace = "" }; xmlAtsortingbuteOverrides.Add(type, xmlAtsortingbutes); XmlSerializer serializer = new XmlSerializer(type, xmlAtsortingbuteOverrides); //Use the following to serialize without namespaces XmlSerializerNamespaces xmlSrzNamespace = new XmlSerializerNamespaces(); xmlSrzNamespace.Add("", ""); serializer.Serialize(writer, objectToSerialize, xmlSrzNamespace); stm.Flush(); stm.Position = 0; } return stm.ToArray(); } }