保存复杂的脚本对象的状态

时间:2011-09-09 12:55:29

标签: c++ python scripting embedding boost-python

在C ++中,我将以下两个类(使用Boost)暴露给Python:

struct Foo {
    // Empty
};

struct FooContainer {
    // I use boost::shared_ptr for compatibility with Boost.Python
    vector<boost::shared_ptr<Foo>> foos_;
};

在Python方面,我可能会创建一个特殊类型的Foo,它实际上做了一些事情而不仅仅是一个空类,然后将它添加到FooContainer中:

class Useful(Foo):
    def __init__(self, a, b):
        self.a = a
        self.b = b

x = Useful(3, 5);
# Add 'x' to a `FooContainer`

回到C ++方面,FooContainer现在有一些Foos,但它不知道或不关心它们来自Python。应用程序运行一段时间,Foo对象中的数据发生变化......

然后我决定要保存程序的状态,以便稍后加载它。但问题是FooContainer对它的Foo对象了解不多,它甚至不知道它们来自Python,我不想用我真正属于它的数据污染我的FooContainer(单个 - 责任原则和所有这些)。

您对我应该如何组织我的应用程序有任何建议,以便保存和加载数据,以及加载新数据(即不是来自我过去保存的状态)可以以明确的方式完成吗?

2 个答案:

答案 0 :(得分:2)

您可以使用boost::python/pickle,并保存python中的数据。我对酸洗套件的经验有限,但如果你在python派生的类中覆盖适当的酸洗方法,它应该可以工作(参见我对this question的回答)。

答案 1 :(得分:1)

您已经拥有创建Foos的python代码,我们可以将其称为populateFoos,并以某种方式让您的程序调用它。

现在您需要的是storeFoosloadFoos功能,它可以进行保存和加载。如果您想保持通用,请将它们定义为storeFuncloadFunc(或callback,具体取决于上下文。)

根据您的程序结构,您可能还需要在python中保留已创建(或与容器相关联)的所有foos的列表。