要素が見つからない場合、C#でXmlSerializerを使用した逆シリアル化に失敗することはありますか?
-
06-07-2019 - |
質問
XmlSerializerを使用して、C#でオブジェクトをXMLに読み書きします。現在、属性 XmlElement
および XmlIgnore
を使用して、オブジェクトのシリアル化を操作しています。
必要なxml要素がxmlファイルにない場合でも、オブジェクトは引き続きデシリアライズ(xml->オブジェクト)できます。特定のフィールドが「必須」であることを(できれば属性を介して)どのように示すのですか?
現在使用している方法のサンプルメソッドを次に示します。
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
私の理想的な解決策は、 XmlRequired
属性のようなものを追加することです。
また、XmlSerializerの動作を操作するために利用可能な属性についての良いリファレンスはありますか?
解決
2番目の部分の回答があります:" XMLシリアル化を制御する属性" 。
まだ最初の部分を調査しています...
編集:XMLの逆シリアル化自体ではこれができないと強く思います。必要な属性を含むサンプルスキーマでxsd.exeを実行しましたが、属性がオプションとしてマークされている場合もまったく同じです。プロパティの設定を要求する方法があれば、その場合に実装することを期待しています。
基本的に、デシリアライズ後にオブジェクトのツリーを検証する必要があると思います。ごめんなさい...
他のヒント
これを行うことがわかった唯一の方法は、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);
}
拡張性の理由から、 XmlSerializer
は逆シリアル化に関して非常に寛容です。 [DefaultValue]
、 ShouldSerialize {Foo}
、および {Foo} Specified
などは、主に シリアル化(例外は {Foo} Specified
です。これは、シリアル化中にクエリされるだけでなく、逆シリアル化中に設定されます)。
それ自体; IXmlSerializable
を実装して自分で実行しない限り、これを行う簡単な方法はありません。 damagenoobは、オプションでもあるxsdオプションを表示します。