2013-02-27 151 views
1

我具有以下树状结构,其中每个电平由单独的类表示:保存树状结构

Book ------ Page ------ Line 
    1 n  1 n 

每个类具有保持其所有成员(E/G/Book::pages一个属性,作为参考文献福地阵列),一些特定于电平特性(例如Book::author)以及一些方法来添加/删除其成员。

现在我想保存/从一个单一的文件中的所有数据加载到/。这不会是一个关系数据库(最有可能YAML将被使用),所以基本上是我需要得到在某些时候是一样的东西:

my $book = { 
    author => "Fred Flinstone", 
    name => "My Favorite Stones", 
    pages => [ 
     { 
      number => 1, 
      footer => "Dedicated to Wilma", 
      lines => [ ], 
     }, 
     { 
      number => 2, 
      lines => [ 
       { text => "Preface", style => "h1" }, 
       { text => "This book is about my favorite stones:" }, 
       { text => "Marble" }, 
       # ... 
      ] 
     }, 
     # ... 
    ] 
}; 

如果有一个智能对在图书方法知道所有成员类?或者每个班级应该实施其中的一部分,例如Line::save返回类似{ text => "Marble" }

什么是实现这个正确方法是什么?我希望尽可能少的解决方案与实际数据相关。如果我决定明天什么添加Page::bookmarks并要保存Bookmark S作为呢?

哦,我使用的驼鹿,但不应该太大的差别。

+0

可以序列并恢复与'Storable'模块祝福的对象。 – PSIAlt 2013-02-27 21:28:34

回答

1

如果您使用的是Moose,我会建议您查看MooseX::Storage来处理此问题。你会在你的包中使用这个模块,然后添加with Storage('format' => 'YAML', 'io' => 'File');

这个简单的例子可以让你开始:

package Book; 
use Moose; 
use MooseX::Storage; 

with Storage('format' => 'YAML', 'io' => 'File'); 

... 

1; 

my $book = Book->new(); 

... 

# to store object 
$book->store('book.yml'); 

# to get object back 
my $book2 = Book->load('book.yml');