Come si rimuovono gli spazi dei nomi XML dalla rappresentazione XML di un oggetto serializzata utilizzando DataContractSerializer?Serializzare l'oggetto senza spazi dei nomi utilizzando DataContractSerializer
Questo oggetto deve essere serializzato su un XML di output molto semplice.
- Ultime & più grande - con .Net 4 beta 2
- L'oggetto non sarà mai bisogno di essere deserializzato.
- XML non dovrebbe avere alcun xmlns: ... ref di namespace
- Devono essere supportati tutti i sottotipi di Eccezione e ISubObject.
- Sarà molto difficile cambiare l'oggetto originale.
Oggetto:
[Serializable]
class MyObj
{
string str;
Exception ex;
ISubObject subobj;
}
Necessità di serializzare in:
<xml>
<str>...</str>
<ex i:nil="true" />
<subobj i:type="Abc">
<AbcProp1>...</AbcProp1>
<AbcProp2>...</AbcProp2>
</subobj>
</xml>
Ho usato questo codice:
private static string ObjectToXmlString(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 StringBuilder();
using (var xw = XmlWriter.Create(sb, new XmlWriterSettings
{
OmitXmlDeclaration = true,
NamespaceHandling = NamespaceHandling.OmitDuplicates,
Indent = true
}))
{
serializer.WriteObject(xw, obj);
xw.Flush();
return sb.ToString();
}
}
Da this article ho adottato una DataContractResolver in modo che nessun sottotipi hanno da dichiarare:
public class AllowAllContractResolver : DataContractResolver
{
public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString 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(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
{
return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? Type.GetType(typeName + ", " + typeNamespace);
}
}
Alcuni degli oggetti secondari non sono sotto il mio controllo e non posso cambiarli. È possibile farlo senza cambiare gli oggetti? – Yurik
No, mi dispiace - non è possibile rimuovere uno spazio dei nomi esistente - devi essere in grado di specificare lo spazio dei nomi sull'oggetto stesso. –
Questo non può essere - per quanto riguarda tutti i tipi di sistema? MS non può aspettarsi che tutti i tipi siano modificabili, ci deve essere un altro modo :( – Yurik