我想就我面临的问题提供一些帮助。
我正在使用序列化(确切地说是TinyXml)将对象保存在文件中,并且我在反序列化方面遇到了问题。
我的对象包含指针,这些指针不是直接保存的,而是保存指向的对象的ID。
我保存的每个对象都直接或不直接派生ASerializable。
//Holds pure virtual method: TiXmlElement * ToXml() = 0;
class ISerializable;
// Basic implementation of ISerializable, this class has a unique ID.
class ASerializable : public ISerializable;
// For security sake, this class is not real, just a demonstration of my problem.
// Overrides TiXmlElement * ToXml()
class Base : public ASerializable;
// Overrides TiXmlElement * ToXml()
class Derived : public Base;
反序列化后,我将我创建的每个对象添加到静态映射(ID,ASerializable *)中,该映射保存数据直到取消引用。
我使用了一个模板类,它包含一个T **,它是所有反序列化完成后取消引用的指针。
template<typename T>
class Reference<T> {
T** ref_ptr;
int id; // This is the ID of the referenced object
void Dereference();
}
基本上,Reference<T>::Dereference()
获取地图中的对象,然后将其转换为良好类型(T*
)并将*ref_ptr
的值更改为强制转换对象。
我正在使用dynamic_cast<T*>( objects_map[id] )
投射我的对象,出于某种原因,它每次都会失败。
我无法从ASerialisable*
投射到Derived*
而不会丢失Derived
的数据。
这是我想要实现的模式:
在反序列化时,该项将自身添加到对象图;
如果对象是引用,请将一个引用(具有良好类型,我知道它)添加到堆栈
完成所有反序列化后,取消堆叠所有引用并调用Dereference()
真的很开心。
非常感谢你和你的宝贵帮助,非常感谢。
{}享受 编辑: 好的,我会尝试更清楚,但它有点复杂。
当我解析我的XML文件时,有时会有一个名为<reference id="X">
的元素:这些元素是对另一个实例的引用(ASerializable
);
当我遇到<reference>
对象时,我将其添加到堆栈中,稍后将被取消引用。
当我遇到一个特定的对象时,比如<Base id="X" ... data ... />
我构建它,然后我将它作为ASerializable*
添加到对象图中;
一旦我完成了所有对象的构建,我将每个引用取消堆栈并调用Dereference()
,它应该获得对象的REAL INSTANCE,使用dynamic_cast
将其转换为良好类型然后更改他的ref_ptr的值指向该对象。
如果需要,请随时提出其他问题。
答案 0 :(得分:2)
答案 1 :(得分:1)
好的,谢谢大家的时间。我发现了问题。
我的层次结构中的一切都很好,问题是正在复制的向量。它包含的指针随后发生了变化,因此我的Reference的ref_ptr已损坏。
{享受}