/// <summary> /// 各プロパティをデフォルト値に初期化します。 /// </summary> public void Reset() { var propertyDic = MethodUtil.GetPropertyDic(GetType()); if (propertyDic == null) { return; } var list = from propObj in propertyDic.Values let prop = propObj.PropertyInfo where prop.DeclaringType != typeof(AppSettingsBase) where propObj.CanWrite // シリアライズの制御属性を調べます。 let attrs1 = prop.GetCustomAttributes( typeof(NonSerializedAttribute), false) where !attrs1.Any() let attrs2 = prop.GetCustomAttributes( typeof(IgnoreSerializedAttribute), false) where !attrs2.Any() // デフォルト値を属性から設定します。 let attrs3 = prop.GetCustomAttributes( typeof(DefaultValueAttribute), false) let valAttr = attrs3.FirstOrDefault() as DefaultValueAttribute let value = (valAttr != null ? valAttr.Value : null) select new { propObj, value }; list.ForEach(_ => ResetProperty(_.propObj, _.value)); }
/// <summary> /// シリアライズします。 /// </summary> void IXmlSerializable.WriteXml(XmlWriter writer) { var propertyDic = MethodUtil.GetPropertyDic(GetType()); foreach (var propertyObj in propertyDic.Values) { var property = propertyObj.PropertyInfo; if (!property.CanRead || !property.CanWrite) { continue; } if (typeof(AppSettingsBase).Equals(property.DeclaringType)) { continue; } // ターゲットとなるプロパティの値を取得します。 object value; if (!this.propertyStorage.TryGetValue(property.Name, out value)) { continue; } var valueType = (value == null ? property.PropertyType : value.GetType()); // 単純型は値をそのまま書き出します。 writer.WriteStartElement(SETTING_TAG); writer.WriteAttributeString(NAME_ATTRIBUTE, property.Name); // 文字列に変換できれば、それをそのまま出力します。 string result; if (TryConvertToString(valueType, value, out result)) { writer.WriteAttributeString(SERIALIZEAS_ATTRIBUTE, "string"); writer.WriteElementString(VALUE_TAG, result); } else { writer.WriteAttributeString(SERIALIZEAS_ATTRIBUTE, "xml"); writer.WriteStartElement(VALUE_TAG); WriteXmlValue(writer, property.Name, valueType, value); writer.WriteEndElement(); } writer.WriteEndElement(); } }
/// <summary> /// デシリアライズします。 /// </summary> void IXmlSerializable.ReadXml(XmlReader reader) { var propertyDic = MethodUtil.GetPropertyDic(GetType()); reader.ReadStartElement(); while (!reader.EOF) { // settingタグの開始ノードまで移動します。 if (!reader.IsStartElement() || reader.LocalName != SETTING_TAG) { if (!reader.ReadToFollowing(SETTING_TAG)) { return; } } // <Setting name="prop name" serialize-as="string or xml"> var name = reader.GetAttribute(NAME_ATTRIBUTE); var serializeAs = reader.GetAttribute(SERIALIZEAS_ATTRIBUTE); if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(serializeAs)) { reader.Read(); continue; } reader.ReadStartElement(SETTING_TAG); // プロパティから名前を検索します。 IPropertyObject propertyObj; if (!propertyDic.TryGetValue(name, out propertyObj)) { continue; } // 種別によって読み込み方を変えます。 if (serializeAs == "string") { ReadStringValue(reader, propertyObj); } else { ReadXmlValue(reader, propertyObj); } reader.ReadEndElement(); } reader.ReadEndElement(); }