だらだらやるよ。

こげつのIT技術メモ

XmlSerializerではまった

最近俺俺ライブラリを作ってたのですが、はまりました。


WindowsMobileアプリで設定画面を楽に作るためのライブラリなんですが、設定の保存部分にXmlSerializerクラスを使ってて、シリアライズはできるけどデシリアライズできないという現象に引っかかりました。


まず結論から言うと、デフォルトコンストラクタを設定してないとうまくデシリアライズできません。
確かに考えると納得なんですけど、リストに放り込んだ設定用の値を持ったインスタンスシリアライズしてたので、リストがまずいのかなーとかちょっとはまりましたね。


一応コードです。
こんな感じのクラスを用意して

public class SettingValue{
	public SettingValue(string key,string value){
		Key = key;
		Value = value;
	}
	public string Key="";
	public string Value="";
}

で、こんなかんじ
XmlSerializerは、自前のラップしたクラス使ってる。

_list.Add(new SettingValue("key1","hoge"));
_list.Add(new SettingValue("key2","hage"));
_list.Add(new SettingValue("key3","hige"));
ExXmlSerializer<SettingValue[]> s = new ExXmlSerializer<SettingValue[]>();
s.Serialize("保存先のファイルパス",_list.ToArray());

で、シリアライズは問題なし。出力もされてる。


ただ、デシリアライズで怒られる

ExXmlSerializer<SettingValue[]> s = new ExXmlSerializer<SettingValue[]>();
_list.Clear();
_list.AddRange(s.Deserialize("保存先のファイルパス") ?? new SettingValue[]{});


最初のクラスをこんな感じに変更して対応終了

public class SettingValue{
	public SettingValue(){}
	public SettingValue(string key,string value){
		Key = key;
		Value = value;
	}
	public string Key="";
	public string Value="";
}

やあ、デフォルトコンストラクタって大事ですね!