我正在寻找一个解决方案,可以透明地持久化Perl数据结构(甚至不是对象,但支持对象会更好),而不会出现循环引用。我并不太在意后端,但我更喜欢JSON。对象数量相对较低(每个哈希引用大约有5个键的数千个)。通过“透明”持久性,我的意思是,我不想每次更新内存中的数据结构时都必须提交更改到存储后端。
以下是代码的理想外观:
以下是代码的理想外观:
my $ds;
...
# load the $ds data structure from 'myfile'
print $ds->{foo}->{bar}; # baz
$ds->{foo}->{bar} = 'quux';
... program dies, but the updated %hash has been persisted automatically in 'myfile'
# in another invocation
print $ds->{foo}->{bar}; # quux
到目前为止,我已经看过:
- Dave Rolsky的Perl面向对象持久化模块合集-自2003年以来没有更新
- brian d foy的精通Perl - 第14章 数据序列化-介绍了DBM::Deep,是一个不错的选择。我希望能更清楚地区分序列化和透明持久化。
- Persistent-自2000年以来没有更新
- SPOPS-自2004年以来已被放弃
- SLOOPS只有一个版本在CPAN上,来自2005年
- Tangram-看起来也被放弃了
- Tie :: File :: AsHash可以进行透明持久化,但仅支持单层哈希
- MooseX :: Storage,Storable和JSON看起来很好,但它们只是序列化,而不是持久化框架
- DBIx :: Class,Class :: DBI,Fey :: ORM,ORM,Rose :: DB是OO-RDBM映射器,我宁愿不使用数据库后端
- DB_File需要BerkeleyDB
- KiokuDB似乎对于这个任务过于复杂
我只找到了一个有前途的模块,DBM::Deep。代码就像例子中的一样,你可以使用它来加载数据结构。
my $ds = DBM::Deep->new( "myfile.db" );
格式是二进制的,不过这并不是大问题,因为我可以使用JSON将其导出为人类可读的格式。
那么,我是否缺少一个模块,而且我是否在正确地解决这个问题?