序列化的类设计 - 想法或模式?

时间:2008-10-23 14:17:10

标签: serialization oop

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

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

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

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

我有两个可能的建议:

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

5 个答案:

答案 0 :(得分:1)

我不知道您正在尝试构建哪种API,但您的建议#1听起来很接近于REST样式服务和API的建议。基本上,Folder对象将包含其子项的URL列表。

答案 1 :(得分:0)

假设您对整个树进行建模,其中每个元素都是Node,Node的特化是Folder,umm,Leaf。你有一个“根”节点。节点有方法

canHaveChildren() 
getChildren() 

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

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

我确实在这些方面设计了一个具有Restful服务的系统。似乎很容易编程。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我不会通过查询方法导航。仅仅因为我想坚持文件夹包含文件夹或页面的域模型。

自定义序列化可能也很棘手,容易出错并且很难改变\了解。

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

干杯, Unmesh

答案 4 :(得分:0)

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

长话短说:最好的解决方案是您的解决方案#1,除了您希望一次发送多个文件夹,因为往返服务器的开销很大...