反序列化和设计的正确性

时间:2016-02-10 21:17:55

标签: c++ serialization architecture boost-serialization

我现在拥有的是一个小型库,可以加载,保存对象图,管理对象的生命周期,GC未使用的对象。它使用boost.serialization

  • 在理想的Universe中输入始终有效,在我的Universe中,某些数据可能会变为无效(Employee中的键可能会变为无效。map<Key, ObjectRef>是侵入式共享指针)。
  • 在加载ObjectRef的过程中(ar >> _some_objects是类型为_some_objects的STL容器)如果密钥无效,ObjectRef的析构函数将通过std::map<Key, ObjectRef>释放其底层对象。只是因为键变得相等而且std :: map不能保持相等的键。
  • Object::release访问某些服务(将对象添加到object-destroy-queue for ex。),但尚未准备好使用,因为反序列化尚未完成。整个问题是低级反序列化调用这样的高级用户代码是不好的!
  • 最糟糕的是,如果稍后反序列化对象 - 破坏队列,则在加载boost.serialization的过程中将清除队列的容器

```

Object::release

```

如何防止低级代码触发高级别调用?可以调用void SomeClass::load(Archive& ar, int version) { // _some_objects is std::map<Key, ObjectRef> ar >> _some_objects; } void Object::release() { // also accesses some services (something like destroy queue) // which aren't ready to use as de-serialization is not complete } ,但不能在整个系统处于某种不一致状态时调用。感谢

  • 我可以阻止Object::release访问任何内容,或以某种方式延迟通话
  • 测试密钥是否有效,然后仅在此情况下加载ObjectRef
  • 不要使用boost.serialization,使用protobufs之类的东西。按正确顺序手动重建所有内容

0 个答案:

没有答案