【问题标题】:XML (de)serialization and schema upgradesXML(反)序列化和模式升级
【发布时间】:2012-02-10 14:34:07
【问题描述】:

我有一个复杂的 XML 可序列化类图,我可以很好地(反)序列化到硬盘。但是如何处理对图架构结构的大量更改?是否有一些机制来处理 XML 模式升级?有些类可以让我将旧数据迁移到新格式?

当然我可以使用XmlReader/XmlWriter,遍历每个节点和属性,并编写数千行代码将数据转换为新格式,但也许有更好的方法?


我找到了Object graph serialization in .NET and code version upgrades,但我认为链接的文章在模型发生重大变化时不适用。

【问题讨论】:

    标签: c# .net xml serialization xml-serialization


    【解决方案1】:

    您可以使用 XSLT,而不是编写数千行代码来使用 XmlReader / XmlWriter 转换文件。我们仍在讨论数百行代码,并且可能执行速度较慢,但​​如果您擅长 XSLT,您可以更快地完成它。

    另一种方法是构建一个连接旧类和新类的 C# 程序(当然,您需要重命名旧类以避免命名冲突)。该程序将从磁盘加载OldMyClass,从其属性值构造NewMyClass,并将NewMyClass 序列化到磁盘。从本质上讲,这种方法将转换任务转移到 C# 领域,这对您来说可能更熟悉。

    【讨论】:

    • +1 谢谢,XSLT 看起来很有前途。但根据stackoverflow.com/questions/1525299/xpath-and-xslt-2-0-for-net,似乎 XSLT 2.0 尚未在 .NET 中实现。由于 XSLT 1.0 已经快 13 年了,我想知道它是否强大到足以处理复杂的更改。
    • @Paja 由于这是一次性交易,因此您不需要 .NET 实现:使用可以从命令行运行的任何 XSLT 引擎。为引擎提供“脚本”和数据,并保存它产生的输出。我用了Saxon,但是11年前很久了;从那时起已经编写了更新的引擎,您可能需要在为任务选择一个之前做一些研究。诚然,编写 XSLT 的学习曲线相对陡峭,但一旦克服了最初的困难,您将能够非常快速地编写大量复杂的转换。
    • 我正在为最终用户编写一个程序,因此迁移算法需要与它一起分发。正因为如此,直接在 .NET 框架中实现会很棒,因为我不喜欢用额外的大型库来膨胀我的设置。
    • @Paja 虽然 XSLT 1.0 规范相对较旧,但我记得它非常非常强大。许多 2.0 功能可能对您没有太大兴趣(例如,支持多个输出文件),而其他功能可能是一种方便,而不是必需品(例如,用户定义的函数)。所以我会从 1.0 开始,只有在绝对需要时才升级到 2.0。 Altova 的社区版为您提供免版税升级路径,以防您无法在 1.0 中完全完成任务。
    【解决方案2】:

    在这种情况下,我将更改保留在对象中并通过 XmlSerializer 重新创建我的 xml:http://support.microsoft.com/kb/815813

    通过这个我加载并保存基于我的对象的新 xml 架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2013-09-24
      相关资源
      最近更新 更多