【问题标题】:Class design for serialization - ideas or patterns?序列化的类设计 - 想法或模式?
【发布时间】:2008-10-23 14:17:09
【问题描述】:

让我从一个说明性示例开始(假设实现是使用静态类型语言,如 Java 或 C#)。

假设您正在构建内容管理系统 (CMS) 或类似的东西。数据按层次组织成Folders。每个文件夹都有一个孩子的集合;一个孩子可能是PageFolder。所有项目都存储在根文件夹中。不允许循环。我们有一个无环图。

系统将有一个远程 API,FolderPage 的实例必须通过网络进行序列化/反序列化。对于文件夹的典型实现,其中文件夹的子级是List,根节点的序列化将发送整个图。由于显而易见的原因,这是不可接受的。

我很想知道人们过去已经解决了这个问题。

我有两个可能的建议:

  1. 查询导航:更改域模型,使文件夹类仅包含每个子项的 ID 列表。要访问一个孩子,我们必须查询它。序列化现在是微不足道的,因为图表在一个明确定义的点结束。主要缺点是我们失去了类型安全性 - ID 可能用于文件夹/子以外的其他内容。
  2. 停止并重新附加:在序列化过程中,只要我们检测到对文件夹或页面的引用,就会停止,而是发送 ID。反序列化时,我们必须查找每个 ID 的对应对象,并将其重新附加到新生对象的相关位置。

【问题讨论】:

    标签: serialization oop


    【解决方案1】:

    我不知道您要构建什么样的 API,但您的建议 #1 听起来与 REST 样式服务和 API 的建议很接近。基本上,Folder 对象将包含指向其子级的 URL 列表。

    【讨论】:

      【解决方案2】:

      查询导航解决方案用于NFS。通过阅读您的问题,在我看来,好像您正在尝试自己实现某种文件系统。

      如果您专门研究通过网络发送对象,则总是有CORBA。除此之外还有DCOM 和更新的WCF。但是等等,那里更像是RMI。此外还有Web Services。我现在就停在这里。

      【讨论】:

        【解决方案3】:

        假设您对整个树建模,其中每个元素都是一个节点,节点的特化是文件夹,嗯,叶子。你有一个“根”节点。节点有方法

        canHaveChildren() 
        getChildren() 
        

        叶子节点有明显的行为(甚至不需要打网络)

        文件夹getChildren()获取下一组节点。

        我确实按照这些思路设计了一个带有 Restful 服务的系统。似乎相当容易编程。

        【讨论】:

          【解决方案4】:

          我不会通过查询导航方法来做到这一点。只是因为我想坚持使用文件夹包含文件夹或页面的域模型。

          自定义序列化也可能很棘手,容易出错且难以更改\理解。

          我建议您在模型中引入和反对 FolderBowser 之类的对象,该模型采用 id 并为您提供文件夹内容列表。这将使您的服务操作更简单。

          干杯, 取消网格

          【讨论】:

            【解决方案5】:

            经典的解决方案可能是使用proxy pattern,其中一些图表通过网络发送,一些文件夹被替换为不会填充其子列表的代理直到他们被查询。往返服务器需要大量时间,如果所有文件夹都是代理,则可能会导致请求过多(每次检查文件夹内容时都会产生一个新请求),因此您想要在每个数据块的大小和典型场景中所需的服务器请求数之间进行一些权衡。这当然是特定于应用程序的,但是发送深度 2 中的所有子文件夹的内容可能是一种有用的策略...

            长话短说:可能最有效的是您的解决方案 #1,但由于往返服务器的开销,您希望一次发送多个文件夹...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多