15

XmlSerializer を使用して、C# で xml にオブジェクトを読み書きしています。現在、属性XmlElementを使用しXmlIgnoreて、オブジェクトのシリアル化を操作しています。

必要な xml 要素が xml ファイルにない場合でも、オブジェクトは正常に逆シリアル化されます (xml -> object)。特定のフィールドが「必須」であることを (できれば属性を介して) 示すにはどうすればよいですか?

これは私が現在使用しているもののサンプルメソッドです:

[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
    set ...;
    get ...;
}

私の理想的な解決策は、属性のようなものを追加することXmlRequiredです。

また、XmlSerializer の動作を操作するために使用できる属性についての適切なリファレンスはありますか?

4

3 に答える 3

16

これを行う唯一の方法は、XSD を使用することです。あなたができることは、逆シリアル化中に検証することです:

static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
    //List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
    ValidationEventHandler validationHandler = (s, e) =>
    {
        //you could alternatively catch all the exceptions
        //exceptions.Add(e.Exception);
        throw e.Exception;
    };

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(schemas);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += validationHandler;

    XmlSerializer serializer = new XmlSerializer(typeof(T));
    using (StringReader sr = new StringReader(xml))
        using (XmlReader books = XmlReader.Create(sr, settings))
           return (T)serializer.Deserialize(books);
}
于 2008-11-03T21:10:23.327 に答える
5

2番目の部分「XMLシリアライゼーションを制御する属性」に対する答えがあります。

前編はまだ調査中…

編集: XML デシリアライゼーション自体でこれを行うことはできないと強く思います。必須属性を含むサンプル スキーマで xsd.exe を実行しました。属性がオプションとしてマークされている場合もまったく同じです。プロパティの設定を要求する方法があれば、その場合に実装されると思います。

オブジェクトのツリーを逆シリアル化した後、基本的にオブジェクトのツリーを検証する必要があると思います。申し訳ありません...

于 2008-11-03T19:58:49.227 に答える
4

拡張性の理由から、XmlSerializer逆シリアル化に関しては非常に寛容です。[DefaultValue]、 、ShouldSerialize{Foo}のようなものは{Foo}Specified主にシリアライゼーション中に使用されます (例外は{Foo}Specifiedであり、デシリアライゼーション中に設定され、シリアライゼーション中に照会されます)。

そのような; 自分で実装して実行しない限り、これを行う簡単な方法はありませんIXmlSerializable。Richard は xsd オプションを示していますが、これもオプションです。

于 2008-11-04T05:10:25.183 に答える