public static void DeserializeOptions(string xml, IDatabaseSchemaView dbView, ISupportOptions withOptions)
        {
            var buffer = Encoding.UTF8.GetBytes(xml);

            using (var memoryStream = new MemoryStream(buffer))
            {
                var adapter = new XmlAdapter(memoryStream);
                var service = new OptionsDeserializationService(adapter);
                XmlSerializerExtensions.Adapter = adapter;

                var metadataService = new MetadataDeserializationService(adapter);

                adapter.Reader.ReadToFollowing(Constants.BehaviorOptionsTag);
                var behaviorOptionsTree = adapter.Reader.ReadSubtree();
                behaviorOptionsTree.Read();
                service.DecodeObject(behaviorOptionsTree, withOptions.BehaviorOptions);
                behaviorOptionsTree.Close();
                adapter.Reader.Read();

                var dbViewOptionsTree = adapter.Reader.ReadSubtree();
                dbViewOptionsTree.Read();
                service.DecodeObject(dbViewOptionsTree, dbView.Options);
                dbViewOptionsTree.Close();
                adapter.Reader.Read();

                var designPaneOptionsTree = adapter.Reader.ReadSubtree();
                designPaneOptionsTree.Read();
                service.DecodeObject(designPaneOptionsTree, withOptions.DesignPaneOptions);
                designPaneOptionsTree.Close();
                adapter.Reader.Read();

                var visualOptionsTree = adapter.Reader.ReadSubtree();
                visualOptionsTree.Read();
                service.DecodeObject(visualOptionsTree, withOptions.VisualOptions);
                visualOptionsTree.Close();
                adapter.Reader.Read();

                var addObjectDialogOptionsTree = adapter.Reader.ReadSubtree();
                addObjectDialogOptionsTree.Read();
                service.DecodeObject(addObjectDialogOptionsTree, withOptions.AddObjectDialogOptions);
                addObjectDialogOptionsTree.Close();
                adapter.Reader.Read();

                var dataSourceOptionsTree = adapter.Reader.ReadSubtree();
                dataSourceOptionsTree.Read();
                service.DecodeObject(dataSourceOptionsTree, withOptions.DataSourceOptions);
                dataSourceOptionsTree.Close();
                adapter.Reader.Read();

                var metadataLoadingOptionsTree = adapter.Reader.ReadSubtree();
                metadataLoadingOptionsTree.Read();
                metadataService.DecodeMetadataLoadingOptions(metadataLoadingOptionsTree, withOptions.MetadataLoadingOptions);
                metadataLoadingOptionsTree.Close();
                adapter.Reader.Read();

                var metadataStructureOptionsTree = adapter.Reader.ReadSubtree();
                metadataStructureOptionsTree.Read();
                service.DecodeObject(metadataStructureOptionsTree, withOptions.MetadataStructureOptions);
                metadataStructureOptionsTree.Close();
                adapter.Reader.Read();

                var queryColumnListTree = adapter.Reader.ReadSubtree();
                queryColumnListTree.Read();
                service.DecodeObject(queryColumnListTree, withOptions.QueryColumnListOptions);
                queryColumnListTree.Close();
                adapter.Reader.Read();

                var queryNavBarTree = adapter.Reader.ReadSubtree();
                queryNavBarTree.Read();
                service.DecodeObject(queryNavBarTree, withOptions.QueryNavBarOptions);
                queryNavBarTree.Close();
                adapter.Reader.Read();

                var userInterfaceOptionsTree = adapter.Reader.ReadSubtree();
                userInterfaceOptionsTree.Read();
                service.DecodeObject(userInterfaceOptionsTree, withOptions.UserInterfaceOptions);
                userInterfaceOptionsTree.Close();
                adapter.Reader.Read();

                var sqlFormattingOptionsTree = adapter.Reader.ReadSubtree();
                sqlFormattingOptionsTree.Read();
                service.DecodeObject(sqlFormattingOptionsTree, withOptions.SqlFormattingOptions);
                sqlFormattingOptionsTree.Close();
                adapter.Reader.Read();

                var sqlGenerationOptionsTree = adapter.Reader.ReadSubtree();
                sqlGenerationOptionsTree.Read();
                service.DecodeObject(sqlGenerationOptionsTree, withOptions.SqlGenerationOptions);
                sqlGenerationOptionsTree.Close();
                adapter.Reader.Read();
            }
        }
 public static void SerializeOptions(string path, IDatabaseSchemaView dbView, ISupportOptions withOptions)
 {
     using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
         using (var xmlBuilder = new XmlDescriptionBuilder(fileStream))
         {
             var service = new OptionsSerializationService(xmlBuilder)
             {
                 SerializeDefaultValues = true
             };
             var metadataService = new MetadataSerializationService(xmlBuilder);
             XmlSerializerExtensions.Builder = xmlBuilder;
             using (var root = xmlBuilder.BeginObject("Options"))
             {
                 // Behavior options
                 using (var behaviorHandle = xmlBuilder.BeginObjectProperty(root, Constants.BehaviorOptionsTag))
                 {
                     service.EncodeObject(behaviorHandle, withOptions.BehaviorOptions);
                 }
                 // Database view options
                 using (var dbViewOptionsHandle = xmlBuilder.BeginObjectProperty(root, Constants.DatabaseSchemaViewOptionsTag))
                 {
                     service.EncodeObject(dbViewOptionsHandle, dbView.Options);
                 }
                 // DesignPaneOptions
                 using (var designPaneOptionsHandle = xmlBuilder.BeginObjectProperty(root, Constants.DesignPaneOptionsTag))
                 {
                     service.EncodeObject(designPaneOptionsHandle, withOptions.DesignPaneOptions);
                 }
                 // VisualOptions
                 using (var visualOptionsHandle = xmlBuilder.BeginObjectProperty(root, Constants.VisualOptionsTag))
                 {
                     service.EncodeObject(visualOptionsHandle, withOptions.VisualOptions);
                 }
                 // AddObjectDialogOptions
                 using (var addObjectDialogHandle = xmlBuilder.BeginObjectProperty(root, Constants.AddObjectDialogOptionsTag))
                 {
                     service.EncodeObject(addObjectDialogHandle, withOptions.AddObjectDialogOptions);
                 }
                 // DataSourceOptions
                 using (var dataSourceOptionsHandle = xmlBuilder.BeginObjectProperty(root, "DataSourceOptions"))
                 {
                     service.EncodeObject(dataSourceOptionsHandle, withOptions.DataSourceOptions);
                 }
                 // MetadataLoadingOptions
                 using (var metadataLoadingOptionsHandle = xmlBuilder.BeginObjectProperty(root, "MetadataLoadingOptions"))
                 {
                     metadataService.Encode(metadataLoadingOptionsHandle, withOptions.MetadataLoadingOptions);
                 }
                 // MetadataStructureOptions
                 using (var metadataStructureOptionsHandle = xmlBuilder.BeginObjectProperty(root, "MetadataStructureOptions"))
                 {
                     service.EncodeObject(metadataStructureOptionsHandle, withOptions.MetadataStructureOptions);
                 }
                 // QueryColumnListOptions
                 using (var queryColumnListOptionsHandle = xmlBuilder.BeginObjectProperty(root, "QueryColumnListOptions"))
                 {
                     service.EncodeObject(queryColumnListOptionsHandle, withOptions.QueryColumnListOptions);
                 }
                 // QueryNavBarOptions
                 using (var queryNavBarOptionsHandle = xmlBuilder.BeginObjectProperty(root, "QueryNavBarOptions"))
                 {
                     service.EncodeObject(queryNavBarOptionsHandle, withOptions.QueryNavBarOptions);
                 }
                 // UserInterfaceOptions
                 using (var userInterfaceOptionsHandle = xmlBuilder.BeginObjectProperty(root, "UserInterfaceOptions"))
                 {
                     service.EncodeObject(userInterfaceOptionsHandle, withOptions.UserInterfaceOptions);
                 }
                 // SqlFormattingOptions
                 using (var sqlFormattingOptionsHandle = xmlBuilder.BeginObjectProperty(root, "SqlFormattingOptions"))
                 {
                     service.EncodeObject(sqlFormattingOptionsHandle, withOptions.SqlFormattingOptions);
                 }
                 // SqlGenerationOptions
                 using (var sqlGenerationOptionsHandle = xmlBuilder.BeginObjectProperty(root, "SqlGenerationOptions"))
                 {
                     service.EncodeObject(sqlGenerationOptionsHandle, withOptions.SqlGenerationOptions);
                 }
             }
         }
 }