3

次のようなオブジェクトに逆シリアル化する必要があるXMLファイルがあります。

public class TestObject
{
    public string Name { get; set; }
    public int Size { get; set; }

    public TestObject()
    {
        Name = string.Empty;
        Size = 0;
    }
}

私の逆シリアル化メソッドは次のようになります。

private TestObject DeserializeConfiguration(string xmlFileName)
{
    XmlSerializer deserializer = new XmlSerializer(typeof(TestObject));
    TextReader textReader = new StreamReader(xmlFileName);
    TestObject testObj = (TestObject)deserializer.Deserialize(textReader);
    textReader.Close();
    return testObj;
}

これは私にとっては十分に機能していますが、場合によっては、無効なデータ型を含む可能性のあるXMLファイルを取得します(「無効」とは、マップする必要のあるオブジェクトプロパティの型を意味します)。たとえば、私のXMLファイルが次のようになっている場合:

<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Orion</Name>
  <Size>abc</Size>
</TestObject>

明らかに、「abc」をオブジェクトの整数のSizeプロパティに変換することはできません。これを逆シリアル化しようとすると、InvalidOperationExceptionが表示されますが、当然のことながら、InnerExceptionは「入力文字列が正しい形式ではありませんでした」です。このエラーをキャッチし、オブジェクトのそのプロパティにデフォルト値を使用して、XMLファイルの残りの部分の逆シリアル化を続行することは可能ですか?そうでない場合、逆シリアル化中に無効なデータを処理するための一般的に見なされている「ベストプラクティス」があるかどうかを誰かに教えてもらえますか?

4

1 に答える 1

3

逆シリアル化する前に、着信 XML を検証する必要があります。基本的に、不適切な形式の XML を処理する必要はありません。検証後、デシリアライザーは少なくともすべての着信 XML がデシリアライズ可能であることを確認できます。

ケースで有効な XML の定義を含む XML スキーマを作成し、最初に XSD (XML スキーマ定義) を使用して着信 XML を検証できます ( http://www.codeguru.com/csharp/csharp/cs_dataも参照)。詳細については、 /xml/article.php/c6737/Validation-of-XML-with-XSD.htmを参照してください)。

幸運を!

于 2012-10-10T13:45:51.313 に答える