Serialisieren Objekt ohne namespaces mit DataContractSerializer
Wie Entferne ich XML-namespaces, die von einem Objekt im XML-Repräsentation serialisiert mittels DataContractSerializer?
Das Objekt muss serialisiert werden, um eine sehr einfache XML-Ausgabe.
- Neueste & größte - mit .Net 4 beta 2
- Das Objekt wird nie brauchen, um deserialisiert werden.
- XML-sollten nicht irgendwelche xmlns:... namespace refs
- Alle Untertypen von Exception und ISubObject müssen unterstützt werden.
- Es wird sehr schwierig sein, die original-Objekt.
Objekt:
[Serializable]
class MyObj
{
string str;
Exception ex;
ISubObject subobj;
}
Müssen Serialisierung in:
<xml>
<str>...</str>
<ex i:nil="true" />
<subobj i:type="Abc">
<AbcProp1>...</AbcProp1>
<AbcProp2>...</AbcProp2>
</subobj>
</xml>
Habe ich diese code:
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();
}
}
Vom dieser Artikel ich nahm eine DataContractResolver, so dass keine Subtypen erklärt werden müssen:
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);
}
}
InformationsquelleAutor Yurik | 2009-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die Klassen markieren, die Sie serialisieren möchten mit:
In diesem Fall werden die Daten contract serializer keinen namespace für Ihre serialisierte Objekte.
Marc
Nein, sorry - Sie können nicht entfernen Sie eine vorhandene namespace - Sie müssen in der Lage sein, um den namespace angeben, der auf das Objekt selbst.
Das kann nicht sein - was ist mit allen system-Typen? MS kann nicht erwarten, dass alle Typen geändert werden, es muss einen anderen Weg 🙁
Nein, gibt es nicht. Es hat nicht wirklich Sinn machen für Sie zu entfernen werden die namespaces.
Bisher habe ich es umgesetzt, meine eigenen XmlWriter (delegieren an die echte), die springt namespaces. Nicht sauber, aber es funktioniert. Ich vermute, dass DataContractResolver ist in der Lage die Lösung für mich... halten die Frage offen, um zu sehen, ob neue Lösungen her.
InformationsquelleAutor marc_s
Wenn Sie Ihr Herz setzen auf das umgehen der default-Verhalten (wie ich derzeit), erstellen Sie eine benutzerdefinierte XmlWriter, der umgeht das schreiben des namespace.
Dann in Ihren Brenner ein Verbraucher, so etwas wie die folgenden:
Sowie die Ausgabe-namespace-Deklarationen in es, aber es wird keine Verwendungen als solche:
Wie So?
Waren Sie nicht versucht, Sie zu überschreiben
WriteStartAttribute
um loszuwerden, die Erklärungen gut?Vielleicht, aber ich brauchte es, namespace frei für eine einfache XSLT-auf dem server also das war meine treibende Grund. Wenn ich die Integration dieser in WebApi für die xml-Serialisierung würde ich auf jeden Fall nutzen Ihr Vorschlag für geringere Ladezeiten.
InformationsquelleAutor leat