新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

Yaml.NETのデシリアライズで、対応するメンバが無い場合に例外を出さず処理する方法

以前の記事で書いたとおり、Yaml.NETのデシリアライズは対応するメンバが無い場合に例外を出す処理になっている。(YAMLファイルにある値が、デシリアライズ先のクラスのメンバに無い場合)

この処理は、データを増減させると前方・後方互換が無くなるので、データの増減がありうるバージョンアップをする場合には相性が悪いという問題があった。

この処理を「対応するメンバが無い場合は、無視して処理続行する」という処理に変更する方法を見つけた。試したところ期待通りに動くので、データ増減があっても互換が切れないようにするという目的は達成できそうだ。

方法は簡単で、次のようにデシリアライザの作成時にIgnoreUnmatchedProperties()を指定するだけ。

var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();

この動作を試したコミット

このIgnoreUnmatchedPropertiesは、ドキュメントには記載されていない。

しかし、ソースコード上のコメントが次の内容である事、

Determines if an exception or null should be returned if name can't be found in type

それと次のプルリクもあったことから、

https://github.com/aaubry/YamlDotNet/pull/88

上記の使い方で合っているようだ。

これで、バージョンアップによるデータ増減がありうる場合でも、安心してYaml.NETを使えるようになった。