Sérialisation de l’object sans espaces de noms à l’aide de DataContractSerializer

Comment supprimer les espaces de noms XML de la représentation XML d’un object sérialisée à l’aide de DataContractSerializer?

Cet object doit être sérialisé en XML très simple.

  • Dernier et meilleur – en utilisant .Net 4 beta 2
  • L’object n’aura jamais besoin d’être désérialisé.
  • XML ne devrait avoir aucun xmlns: …
  • Tous les sous-types d’Exception et ISubObject doivent être pris en charge.
  • Il sera très difficile de changer l’object d’origine.

Objet:

[Serializable] class MyObj { ssortingng str; Exception ex; ISubObject subobj; } 

Besoin de sérialiser dans:

  ...   ... ...   

J’ai utilisé ce code:

 private static ssortingng ObjectToXmlSsortingng(object obj) { if (obj == null) throw new ArgumentNullException("obj"); var serializer = new DataContractSerializer( obj.GetType(), null, Int32.MaxValue, false, false, null, new AllowAllContractResolver()); var sb = new SsortingngBuilder(); using (var xw = XmlWriter.Create(sb, new XmlWriterSettings { OmitXmlDeclaration = true, NamespaceHandling = NamespaceHandling.OmitDuplicates, Indent = true })) { serializer.WriteObject(xw, obj); xw.Flush(); return sb.ToSsortingng(); } } 

A partir de cet article, j’ai adopté un DataContractResolver pour qu’aucun sous-type ne soit déclaré:

 public class AllowAllContractResolver : DataContractResolver { public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionarySsortingng typeName, out XmlDictionarySsortingng typeNamespace) { if (!knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace)) { var dictionary = new XmlDictionary(); typeName = dictionary.Add(dataContractType.FullName); typeNamespace = dictionary.Add(dataContractType.Assembly.FullName); } return true; } public override Type ResolveName(ssortingng typeName, ssortingng typeNamespace, Type declaredType, DataContractResolver knownTypeResolver) { return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? Type.GetType(typeName + ", " + typeNamespace); } } 

Vous devez marquer les classes que vous souhaitez sérialiser avec:

 [DataContract(Namespace="")] 

Dans ce cas, le sérialiseur de contrat de données n’utilisera aucun espace de noms pour vos objects sérialisés.

Marc

Si vous êtes sur le sharepoint contourner le comportement par défaut (comme je le fais actuellement), vous créez un XmlWriter personnalisé qui contourne l’écriture de l’espace de noms.

 using System.IO; using System.Xml; public class MyXmlTextWriter : XmlTextWriter { public MyXmlTextWriter(Stream stream) : base(stream, null) { } public override void WriteStartElement(ssortingng prefix, ssortingng localName, ssortingng ns) { base.WriteStartElement(null, localName, ""); } } 

Ensuite, chez votre consommateur écrivain, quelque chose comme:

 var xmlDoc = new XmlDocument(); DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); using (var ms = new MemoryStream()) { using (var writer = new MyXmlTextWriter(ms)) { serializer.WriteObject(writer, obj); writer.Flush(); ms.Seek(0L, SeekOrigin.Begin); xmlDoc.Load(ms); } } 

Et la sortie aura des déclarations d’espace de noms, mais il n’y aura pas d’utilisations en tant que telles:

   Item1 Item2