/// <summary> /// ExpandoObjectをシリアライズする /// </summary> /// <param name="writer"></param> public static string ToXml(ExpandoObject bag, string root) { var xml = new StringWriterWithEncoding(Encoding.UTF8); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; using (var writer = XmlWriter.Create(xml, settings)) { // ドキュメント開始 writer.WriteStartDocument(); // ルート要素 writer.WriteStartElement(root); var thisdic = bag as IDictionary <string, object>; foreach (string key in thisdic.Keys) { var value = thisdic[key]; if (value is Delegate) { continue; } Type type = null; if (value != null) { type = value.GetType(); } // キーをエレメント名にする writer.WriteStartElement(key as string); // 具の型をエレメントのアトリビュートにし具を書き出すのだが if (value == null) { // nullは特別な型にして空エレメントにする writer.WriteAttributeString("type", "nil"); } else { // 型名をアトリビュートに設定 if (type.Name != "String") { writer.WriteStartAttribute("type"); writer.WriteString(type.FullName); writer.WriteEndAttribute(); } if (value is IConvertible) { // IConvertibleを持っている型(主に組み込み型)は単純変換ができるので // そのまま具を書き出す writer.WriteValue(value); } else { // 複雑な型はシリアライザに丸投げ、なのでXMLがキモくなる var ser = new XmlSerializer(value.GetType()); ser.Serialize(writer, value); } } // このエレメントは出来上がり writer.WriteEndElement(); } // ルート要素終了 writer.WriteEndElement(); // ドキュメント終了 writer.WriteEndDocument(); } return(xml.ToString()); }
/// <summary> /// ExpandoObjectをシリアライズする /// </summary> /// <param name="writer"></param> public static string ToXml( ExpandoObject bag , string root ) { var xml = new StringWriterWithEncoding( Encoding.UTF8 ); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; using ( var writer = XmlWriter.Create( xml , settings ) ) { // ドキュメント開始 writer.WriteStartDocument(); // ルート要素 writer.WriteStartElement( root ); var thisdic = bag as IDictionary<string , object>; foreach ( string key in thisdic.Keys ) { var value = thisdic[key]; if ( value is Delegate ) { continue; } Type type = null; if ( value != null ) { type = value.GetType(); } // キーをエレメント名にする writer.WriteStartElement( key as string ); // 具の型をエレメントのアトリビュートにし具を書き出すのだが if ( value == null ) { // nullは特別な型にして空エレメントにする writer.WriteAttributeString( "type" , "nil" ); } else { // 型名をアトリビュートに設定 if ( type.Name != "String" ) { writer.WriteStartAttribute( "type" ); writer.WriteString( type.FullName ); writer.WriteEndAttribute(); } if ( value is IConvertible ) { // IConvertibleを持っている型(主に組み込み型)は単純変換ができるので // そのまま具を書き出す writer.WriteValue( value ); } else { // 複雑な型はシリアライザに丸投げ、なのでXMLがキモくなる var ser = new XmlSerializer( value.GetType() ); ser.Serialize( writer , value ); } } // このエレメントは出来上がり writer.WriteEndElement(); } // ルート要素終了 writer.WriteEndElement(); // ドキュメント終了 writer.WriteEndDocument(); } return xml.ToString(); }