1

DataContractおよびDataMember属性は、オブジェクトをファイルにシリアライズするため、およびDataContractSerializer. 次のプライベート フィールドとパブリック プロパティを持つクラスがあるとします。

public class MyClass
{
    private int positiveValue;

    public int PositiveValue
    {
        get { return positiveValue; }
        set
        {
            if (value < 1)
                throw new ArgumentOutOfBoundException(...);
            positiveValue = value;
        }
    }
}

ここで、以前にシリアル化されたオブジェクトの状態を含む XML ファイルがあり、ユーザーがこのファイルを変更して、プロパティに正しくない値 (つまり正でない値) を指定したとしPositiveValueます。ファイルの値が無効であるため、逆シリアル化中に例外がスローされます。

ファイルからオブジェクトのリストをデシリアライズしたいとしMyClassます。オブジェクトが有効でない場合、例外がスローされます。DataContractSerializerが無効なオブジェクトを無視するようにすることは可能ですか? さらに、今説明した問題を考慮して、DataMember 属性が適用されたプロパティで例外をスローすることをお勧めしますか?

4

2 に答える 2

2

プロパティを設定するときにデータを検証したいが、逆シリアル化中にこれらの検証をバイパスしたい場合は、プロパティのバッキング フィールドをプロパティのDataMemberAttribute代わりに でマークできます。これによりDataContractSerializer、値が (プロパティではなく) フィールドに直接設定され、検証例外がスローされなくなります。

[DataMember]
private int positiveValue;

public int PositiveValue
{
    get { return positiveValue; }
    set
    {
        if (value < 1)
            throw new ArgumentOutOfBoundException(...);
        positiveValue = value;
    }
}

バッキング フィールドはプライベートにすることができることに注意してください (そうしないと、プロパティはあまり意味がありません)。これは でうまく動作しDataContractSerializerます。

さらに、今説明した問題を考慮して、DataMember 属性が適用されたプロパティで例外をスローすることをお勧めしますか?

これは、アプリケーションで無効なデータを持つオブジェクトを許可するかどうかによって異なります。無効なデータの設定を許可しないことの利点は、オブジェクトを使用するたびにオブジェクトをチェックする必要がないことですが、その場合、ユーザー入力をすべてチェックし、データをロードするときの例外に備える必要があります。ただし、データ メンバー プロパティで例外をスローすることは間違っているとは思いません。それは単に設計上の決定の問題です。

于 2012-09-20T12:37:06.363 に答える
1

リストに関しては、DCS に無効なオブジェクトを無視させることはできません。例外が発生すると、デシリアライズ全体が中止されます。スローしない場合は、リストに追加されます。

デシリアライゼーションとは別に、有効性を確認することを検討します。場合によっては、「リスト内の無効なアイテムは無視してください」と言うことができるかもしれませんが、率直に言って、問題がある場合は、すべてを拒否したいだけです。

于 2012-09-19T17:41:52.627 に答える