对象到xml转换的设计模式

时间:2012-07-12 14:38:37

标签: design-patterns xml-serialization

我们有一组不同的POCO实体,它们代表应用程序的域模型。现在我们需要提出一个xml表示来编译来自不同实体的数据,这些数据将由其他一些应用程序使用。我们有一个关于最终表示应该如何的参考xml。

基于以上所述,我有两个主要针对最佳实践和优化的问题:

  • 给定目标xml结构,基于来自不同实体的数据创建xml文件的最佳和推荐方法是什么?我应该尝试使用xsl转换或基于xsd生成目标类并使用自定义翻译等
  • 由于这是POC练习的一部分,因此XML转换最终将替换为数据库中的数据持久性或/和转换为JSON对象。我想知道我是否可以使用一些设计模式来抽象出目标实现,这样当xml生成例程被DAL调用或JSON转换代码替换时,主代码就不会受到影响。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用MS xsd tool基于目标xsd创建目标模型(POCO-ish),并通过隐藏翻译实现的Facade进行代码转换。

要简化您可以使用的转换,例如Automapper on github

从目标模型中可以很容易地使用例如Entity Framework生成XML,JSON或持久化数据。

genric JSON序列化示例:

    public static string GetString<T>(T value)
    {
        using (var ms = new MemoryStream())
        {
            var ser = new DataContractJsonSerializer(typeof(T));
            ser.WriteObject(ms, value);
            byte[] json = ms.ToArray();
            ms.Close();
            return Encoding.UTF8.GetString(json, 0, json.Length);
        }
    }

我过去曾尝试过XSLT路线,虽然功能强大,但它有快速复杂的趋势。使用上面的目标模型,您可以根据需要调试转换,它还为您提供了一系列前进的机会。

Re:AutoMapper ,在这种情况下,当目标结构很复杂且可能与源不同时,很难让AutoMapper直接映射所有内容,我通常会创建一个负责的Orchestrator / SuperMapper对于在内部使用AutoMapper的整体结构/映射。

提示:如果目标需要多个值,则可以将其设置为同一对象的映射序列,请参阅此question/answer

如果没有特定的结构,很难给出一个很好的通用答案。

Re:Facade 维基百科对此模式有一个很好的定义&gt;&gt; Facade on Wikipedia 但简而言之,为Orchestrator / SupperMapper定义最简单的接口,以便将结构与应用程序其余部分的内部工作分开。这样,当您的需求发生变化时,您可以轻松地将其换成其他东西。这样,您的应用程序的其余部分无需了解AutoMapper或目标模型。所有它知道的是放入源模型并期望让Json回来。例如。

答案 1 :(得分:0)

您在这里寻找的设计模式是Data Transfer Object (DTO)。这些是没有行为的简单类。然后,您将创建一个Assembler,以便从您的应用程序的域模型转换为DTO。

假设您使用的是C#或VB.Net,可以使用xsd.exe轻松创建DTO。我相信你可以找到其他语言的等价物。

一旦你完成了这个设置,你在汇编程序中放置转换的内容就不那么重要了,因为它很好地封装了。如果您需要,可以在将来轻松更改。然而,正如汤米所说,我建议不要使用XSLT。 XSLT实际上只允许您更改XML文档的形状,它不容易允许替换值(ids的枚举名称)或计算(订单行的总和等)。

有关详细信息,请参阅:

http://martinfowler.com/eaaCatalog/dataTransferObject.html
http://msdn.microsoft.com/en-us/library/ms978717.aspx
http://en.wikipedia.org/wiki/Data_transfer_object