如何将大类序列化为多个文件

时间:2017-12-30 22:45:13

标签: c# serialization xml-serialization datagrip

我正在尝试自动设置datagrip工作。每个项目都有一些文件来定义数据源是什么,工作区是什么样的等等。令我困惑的部分是如何实现“multifile-model”的想法。下面是一个示例:为了便于使用,我将每个项目放在一个git存储库中并创建了一个新项目并提交了它。然后我添加了一个新的数据库连接到ms.sql数据库,需要Windows身份验证。在dataSources.xml中,它看起来类似于

<project version="4">
  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
    <data-source name="test" source="LOCAL" uuid="fcc0408c-408c-fcc0-e254-83c7094db613">
      <driver-ref>sqlserver.ms</driver-ref>
      <synchronize>true</synchronize>
      <jdbc-driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</jdbc-driver>
      <jdbc-url>jdbc:sqlserver://myserver\someinstance;databaseName=somedatbase;</jdbc-url>
      <auto-commit>false</auto-commit>
    </data-source>
<!-- 95 more datasources -->
  </component>
</project>

使这部分变得相当容易

DataSourceElement.cs

[XmlRoot("data-source")]
public class DataSourceElement
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlAttribute("source")]
    public string Source { get; set; }

    [XmlAttribute("uuid")]
    public Guid Uuid { get; set; }

    [XmlElement("driver-ref")]
    public string DriverRef { get; set; }

    [XmlElement("synchronize")]
    public bool Synchronized { get; set; }

    [XmlElement("jdbc-driver")]
    public string DriverName { get; set; }

    [XmlElement("jdbc-url")]
    public string DriverUrl { get; set; }

    [XmlElement("default-dialect")]
    public string DefaultDialect { get; set; }

    [XmlElement("auto-commit")]
    public bool IsAutoCommit { get; set; }

    [XmlArray("driver-properties")]
    [XmlArrayItem("property")]
    public List<DatagripPropertyElement> DriverProperties { get; set; } = new List<DatagripPropertyElement>();

    [XmlArray("jdbc-additional-properties")]
    [XmlArrayItem("property")]
    public List<DatagripPropertyElement> DriverAdditionalProperties { get; set; } = new List<DatagripPropertyElement>();
}

DataSourceManagerImpl.cs **

[XmlRoot("component")]
public class DataSourceManagerImpl : ComponentElement
{
    [XmlAttribute("format")]
    public string Format { get; set; }

    [XmlAttribute("multifile-model")]
    public bool MultiFileModel { get; set; }

    [XmlElement("data-source")]
    public List<DataSourceElement> DataSources { get; set; } = new List<DataSourceElement>();
}
[XmlRoot("component")]
public abstract class ComponentElement
{
    [XmlAttribute("name")]
    public string Name { get; set; }
}

DataSourceProject.cs

[XmlRoot("project")]
public class DataSourceProject : ProjectElement
{
    [XmlElement("component")]
    public DataSourceManagerImpl Component { get; set; }
}
[XmlRoot("project")]
public abstract class ProjectElement
{
    [XmlAttribute("version")]
    public int Version { get; set; }
}

linqpad进行测试

private const string DATAGRIP_PROJECT = @"C:\Users\snyder\.DataGrip2017.3\config\projects";
void Main()
{
    DataSourceManager = new DataSoureProject();
    //initialize omitted
    Save(DATAGRIP_PROJECT, "default");
}

    public void Save(string datagripProjectPath, string datagripProjectName)
    {
        var projectPath = Path.Combine(datagripProjectPath, datagripProjectName, ".idea");
        WriteToFile(DataSourceManager, Path.Combine(projectPath, "datasources.xml"));
    }

    private static void WriteToFile<T>(T obj, string fullPath, bool omitXmlDeclaration = true)
    {
        var settings = new XmlWriterSettings
        {
            OmitXmlDeclaration = omitXmlDeclaration,
            Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false),
            Indent = true,
        };
        using (var writer = XmlWriter.Create(fullPath, settings))
        {
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(writer, obj, ns);
        }
    }

然后我查看datasources.Local.xml,其中包含我想要的位

<data-source name="test" uuid="fcc0408c-408c-fcc0-e254-83c7094db613">
  <database-info product="" version="" jdbc-version="" driver-name="" driver-version="" />
  <domain-auth>true</domain-auth>
</data-source>

首先,我考虑将所述属性添加到我的DataSourceElement类,但无法弄清楚如何拆分属性。那么我就像..我想我可以复制课程并假装他们是不同的。任何人,搜索都没有发现。所以现在我问..是否可以在我的DataSourceElement类中添加一些属性,这些属性只会添加到另一个文件中?如果是这样的话?

1 个答案:

答案 0 :(得分:0)

我想我想到的东西可能会让它更容易,并且基于@jdweng和@ code4life评论

我在想,如果我要查看jetbrains项目是否存在,我可以使用序列化来创建文件夹和文件。这很容易也很简单,因为它只是骨架。然后,我可以使用XDocument加载骨架,并根据需要使用AutoMapper更新/创建连接,以便根据需要创建XElement。这应该可以使所有方面的生活更轻松,并且如果需要的话可以轻松添加,或者如果jetbrains决定更改编码,则可以更改它。