DataContractSerializerを使用してシリアル化されたオブジェクトのXML表現からXML名前空間を削除するにはどうすればよいですか?DataContractSerializerを使用した名前空間のないオブジェクトのシリアル化
このオブジェクトは、非常に単純な出力XMLにシリアライズする必要があります。最大
- 最新& - ネット4のベータ2
- オブジェクトを使用して直列化復元する必要はありません。
- xmlns:... namespace refs
- ExceptionおよびISubObjectのサブタイプをサポートする必要があります。
- 元のオブジェクトを変更することは非常に困難です。
オブジェクト:
[Serializable]
class MyObj
{
string str;
Exception ex;
ISubObject subobj;
}
のにシリアライズする必要があります:何のサブタイプが持たないように、私はDataContractResolverを採用this articleから
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();
}
}
:
<xml>
<str>...</str>
<ex i:nil="true" />
<subobj i:type="Abc">
<AbcProp1>...</AbcProp1>
<AbcProp2>...</AbcProp2>
</subobj>
</xml>
私はこのコードを使用宣言する:
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);
}
}
一部のサブオブジェクトは私のコントロール下になく、私はそれらを変更することはできません。オブジェクトを変更せずに行うことは可能ですか? – Yurik
いいえ、申し訳ありません - 既存の名前空間を削除することはできません。オブジェクト自体に名前空間を指定する必要があります。 –
これはできません - すべてのシステムタイプはどうですか? MSはすべてのタイプが変更可能であるとは期待できませんが、別の方法が必要です:( – Yurik