保存树状结构

时间:2013-02-27 21:18:00

标签: perl persistence

我有以下树状结构,其中每个级别由单独的类表示:

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" },
                # ...
            ]
        },
        # ...
    ]
};

Book中是否应该有一对智能方法可以了解所有成员类?或者每个类应该实现它的一部分,以便例如Line::save返回了类似{ text => "Marble" }的内容?

正确的实现此方法的方法是什么?我希望解决方案尽可能与实际数据相关。如果我明天决定添加Page::bookmarks并希望保存Bookmark,该怎么办?

哦,我正在使用Moose,虽然这不会产生太大的影响。

1 个答案:

答案 0 :(得分: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');