예제 #1
0
        /// <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();
        }