0

私の質問はこの問題に関連しています。子から親への仮想ナビゲーションプロパティを持つPOCOクラスがあります。親には子のコレクションがあります。

public class Parent
{
    public virtual List<Child> Children { get; set; }
}

public class Child
{
    public string ParentID { get; set; }

    [XmlIgnore]
    [ForeignKey("ParentID")]
    public virtual Parent Parent { get; set; }
}

さて...あなたはそれを推測しました-私はEFから来る親(すなわちプロキシ)をXmlSerializerでシリアル化しようとします。最初に、私が何らかの方法で処理するすべての不明なタイプ(動的に生成されたクラス)について不平を言います。しかし、それは「循環参照」の例外を除いて例外です。

調査の結果、XmlIgnore属性は、プロキシオブジェクトのParentプロパティへのリフレクションでは検出できないことが判明しました。

    Type.GetType("System.Data.Entity.DynamicProxies.Child_2C9351FD5E156D94E5BF2C68DABFC2A956181C99A0C2E4E6B592E6373D8645ED, EntityFrameworkDynamicProxies-Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
.GetProperty("Parent").GetCustomAttributes(typeof(XmlIgnoreAttribute), true) <-- returns 'None'

プロキシオブジェクトのタイプベースタイプは私のChildクラスです。はXmlIgnoreAttribute継承フラグを設定せず、デフォルトはtrueであるため、これは機能するはずです。何が起こっている?

プロキシオブジェクトはその基本タイプについて嘘をついていますか?

'manual' xmlシリアル化を記述せずにこの問題を回避するにはどうすればよいですか(XmlSerializerを使用する必要があります)。

更新:XMLSerializerは、間違っているように見える属性の「継承」を尊重していないことが判明しました。それはバグですか、それとも仕様によるものですか?

4

1 に答える 1

0

このmsdnの記事(備考セクション)によると:

'このメソッドは、プロパティとイベントの継承パラメーターを無視します。プロパティとイベントの属性の継承チェーンを検索するには、Attribute.GetCustomAttributesメソッドの適切なオーバーロードを使用します。

したがって、これはプロキシとは何の関係もありません。この例を見てください:

public class Test
{
    [XmlIgnore]
    public virtual int Property { get; set; }
}

public class Derived : Test
{
    public override int Property { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(
            typeof(Derived)
           .GetProperty("Property")
           .GetCustomAttributes(typeof(XmlIgnoreAttribute), true)
           .Count());

        Console.WriteLine(
           Attribute.GetCustomAttributes(
               typeof(Derived)
              .GetProperty("Property"), true)
              .Count());
    }
}

そして結果:

0
1
Press any key to continue . . .
于 2013-01-18T06:49:43.320 に答える