2

XmlSerializorにいくつかのヒントを追加して、インターフェイスをシリアル化/逆シリアル化できるようにしようとしています。XmlIncludeAttributeをクラスの装飾として追加することはできません。代わりに、シリアル化オーバーライドをXmlSerializorに渡します。

var _xs = new XmlSerializer(typeof(Model.ISession), SerializationOverrides());

このSerializationOverrides()ように見えます:

private static XmlAttributeOverrides SerializationOverrides()
{
    var overrides = new XmlAttributeOverrides();

    overrides.Add(typeof(Model.ISession), XmlInclude(typeof(Model.Session)));

    return overrides;
}

ここまでは順調ですね。このXmlInclude(...)メソッドは新しいXmlAttributesオブジェクトを作成しますが、 XmlIncludeAttribute属性を追加する方法がわかりません。

private static XmlAttributes XmlInclude(Type type)
{
    var attrs = new XmlAttributes();

    attrs....Add(new XmlIncludeAttribute(type)); // Add how?????

    return attrs;
}

提案?

4

2 に答える 2

3

XmlSerializerコンストラクターは、次のような「追加タイプ」の配列を受け入れることができます。

var _xs = new XmlSerializer(typeof(Model.ISession), 
    SerializationOverrides(), new Type[] { typeof(Model.Session), 
    new XmlRootAttribute("Session"), "");

これを行うだけでなく、オーバーライドにXmlElementsを追加することで、うまくいくようです。

private static XmlAttributeOverrides SerializationOverrides()
{
    var overrides = new XmlAttributeOverrides();

    overrides.Add(typeof(Model.ISession), XmlInclude("Session", typeof(Model.Session)));

    return overrides;
}

private static XmlAttributes XmlInclude(string name, Type type)
{
    var attrs = new XmlAttributes();
    attrs.XmlElements.Add(new XmlElementAttribute(name, type));
    return attrs;
}
于 2012-11-12T06:49:08.960 に答える
0

私の知る限りでは、 コンパイル時に属性を提供する必要はありません。 属性は静的データであり、最善の策はおそらくTypeDescriptorを使用することです。(見てください)おそらく、必要な属性を持つ派生クラスを作成することを試みることができますか?

TypeDescriptor.CreateProperty

編集。あなたができるように見えます!

ここでMarcGravellの回答を参照してください

例:

 var aor = new XmlAttributeOverrides();
        var Attribs = new XmlAttributes();
        Attribs.XmlElements.Add(new XmlElementAttribute("Session", typeof(Model.Session)));
        aor.Add(typeof(type), "Models", listAttribs);

        XmlSerializer ser = new XmlSerializer(typeof(type), aor);
于 2012-11-12T04:19:37.467 に答える