1

bool プロパティを持つ単純なクラスがあります。このプロパティの「Get」ロジックはストアド プロシージャを実行して、データベースからビット フィールドを返します。

次に、このクラスをシリアル化し、データベースの XML フィールドに保存します。クラスと bool プロパティは問題なく保存されます。

私が抱えているように見える問題は、このクラスを逆シリアル化するときです。クラスは正常にデシリアライズされますが、bool フィールドを駆動するデータが更新されると、クラスは XML でシリアル化されたもののみを認識し、データベースを参照して新しい bool 値を取得しないようです (実行されません)。新しく更新されたビットフィールドを取得する私の手順)。

私の解決策は、このフィールドに XmlIgnoreAttribute 属性を追加して、最初からシリアル化されないようにすることでした。しかし、誰かがこれに気づいたり、.NET XmlSerializer クラスの内部動作を理解するのに役立つかどうか疑問に思っています。

ありがとう!

[XmlIgnoreAttribute]
    public bool IsUpdated
    {
        get
        {
            DataTable dtResults = mclsSQLServerTool.LoadDataTable("exec stp_RL_SEL_NameIsUpdated '" + mstrName + "'");
            bool blnIsUpdated = Convert.ToBoolean(dtResults.Rows[0]["RU_bitIsUpdated"]);

            return blnIsUpdated;

        }
    }
4

2 に答える 2

0

ここで最初に注意すべきことは、[XmlIgnore]冗長であることです。取得専用プロパティ (リストを除く) には関心がありません。これは、それらを逆シリアル化できないことがわかっているためですXmlSerializer。例えば:

public class SomeType
{
    public string Foo { get; set; }
    public string Bar { get { Console.WriteLine("get_Bar"); return "abc"; } }

    static void Main()
    {
        var ser = new XmlSerializer(typeof (SomeType));
        ser.Serialize(Console.Out, new SomeType { Foo = "def" });
    }
}

出力 (名前空間のエイリアスなどを除く):

<SomeType>
  <Foo>def</Foo>
</SomeType>

Bar(呼び出されていないことに注意してください)

逆シリアル化のプロセス (リストではなく、単純な値の場合) は単純です。値は着信 xml ストリームで検出されるため、それらをメンバーに解決し、割り当てます。 xml ノード。

データが着信 xml にある (およびプロパティが読み取り/書き込み可能でない) 場合を除き、「セット」をランダムに呼び出すことはありません。その場合、値を割り当てることが期待されます。

あなたのシナリオで興味深いのは、「get」がどこにも値を割り当てないことです-キャッシュはありません。実際には、それに触れなくても問題ありXmlSerializerません。アクセスするたびIsUpdatedにクエリが実行されます。個人的には、これは間違いであり、攻撃的で予測不可能なデータ クエリにつながる可能性があると思います。

多くのシリアライザーは、シリアライゼーションの最後にコードを実行できるシリアライゼーション コールバックの概念をサポートしています。ただし、これはサポートされてXmlSerializer いません。したがって、それはオプションではありません。

あなたが達成したいことはあまり明確ではありませんが、ある時点でメソッドを呼び出すだけです。

于 2012-06-04T18:33:48.883 に答える