序列化对象生成器与访客的设计模式是什么?



我正在尝试通过示例来学习OOPS。所以我尝试实现一个对象序列化器。对象是相同的,但它可以序列化为XML,JSON等。我看到两种类型的建议。

在这个博客中,他们说我们可以使用访问者/双重调度来序列化对象。

http://codebetter.com/jeremymiller/2007/10/31/be-not-afraid-of-the-visitor-the-big-bad-composite-or-their-little-friend-double-dispatch/

但是,根据定义,我们正在从复杂对象构建序列化对象,因此创建XMLBuilder和JSONBuilder是有意义的。

现在,哪种方法是正确的?

学习设计模式的目的是用解决方案的想法来准备你的工具包,而不是在解决测试问题时遵循教条。

在现实世界的场景中,很少有完美的选择。您必须平衡权衡,并决定哪种方法最适合手头的情况。

为什么不尝试这两种方法并评估您喜欢这些方法的地方?

访问者模式的维基百科条目很好地概述了您可能想要选择访问者模式的原因。"用例示例"尤其直接适用于您的问题。

此类型层次结构的基本操作是将图形保存为系统的本机文件格式。

同样,可以应用生成器模式。但请注意,此模式的重点是从多个源创建复杂的输出。Builder 形式化了正在进行的工作的概念,允许您收集状态,直到可以生成输出对象。

我认为访客模式更简单地满足您的需求。但是,选择权在您手中 - 这就是软件开发的美丽(和诅咒(!

尽管上面有比尔·比克福德(Bill Bickford(的学问回复和维基的例子,但可能需要退后一步。

您绝对不需要BuilderVisitor来创建像 XMLBuilder 或 JSONBuilder 这样的序列化程序。CodeBetter 链接中的示例试图演示双重调度及其与访客模式的关系。在我看来,他的例子充其量是令人困惑的。

例如,C# XMLSerialiser 对象将构造为之的任何类型的对象转换为 XML 文档。看不到访客或任何其他模式!如果需要,有一个单独的过程持久化序列化文档(到任何存储类型(,当您将这些操作(序列化和持久性(组合在对象数组上时,这就是Visitor适用的地方。

访客模式不是教数组中的每个对象如何以一系列可能的格式存储自身,而是允许另一个对象"访问"并执行存储操作。这几乎正是 Wiki Visitor 示例,它显示了如何持久化不同的形状对象,而每个形状都不知道如何保存自己。

因此,您可以独立于访客或构建器来研究序列化,因为它们不相关......我想你怀疑了! 如果你是模式的新手,访客是最难掌握的模式之一.....

对象(acceptor(知道它的结构,序列化程序(访问者(知道如何写下基元/简单类型。两者结合起来,它们可以序列化/反序列化整个对象图。这就是二进制调度或访客。

但是,语言或程序员以统一的格式公开对象元数据可以更容易,在运行时更快,因此任何人/任何东西都可以遍历对象图而无需双重调度。甚至在编译对象时使用编译器插件生成编解码器。

Builder 通常与命名参数模式一起使用,以使具有多个相似参数的构造对象不易出错(使用构造函数可以轻松交换两个相同类型的参数(。它由生成的 Protobuf 包装器使用,但与反序列化没有严格关系。

相关内容

  • 没有找到相关文章

最新更新