У меня проблема с сериализацией с использованием SDK Marmalade. Я понимаю принципы, такие как сериализационные примитивы, но как насчет полиморфных объектов?
В соответствии с примерами Marmalade вы сериализуете такие объекты:
void Serialise()
{
uint8 isObject;
if (IwSerialiseIsWriting())
// writing
{
// record whether m_Happy exists
isObject = m_Happy ? 1 : 0;
IwSerialiseUInt8(isObject);
// serialise out m_Happy if it exists
if (m_Happy)
m_Happy->Serialise();
}
else
// reading
{
IwSerialiseUInt8(isObject);
// if an object was written out then read it in
if (isObject)
{
// if m_Happy already exists then delete it
if (m_Happy)
delete m_Happy;
m_Happy = new CHappy;
// serialise in m_Happy
m_Happy->Serialise();
}
}
}
Мой вопрос в том, как вы можете использовать этот метод, когда у вас есть полиморфный тип? Например:
У меня есть объект:
AbstractClass *object;
Как можно инициализировать этот объект при сериализации? В соответствии с простым примером Marmalade я бы:
// reading
if(objectExists) {
object = new AbstractClass(); // uh oh
}
чтобы использовать это для вызова нового в одном из конкретных подклассов. Например -
//Writing -
AbstractClass *object = new ConcreteClass();
object->Serialise();
Где ConcreteClass
является конкретным подклассом AbstractClass
. Теоретически вы не должны иметь объект только класса Abstract, если не используете полиморфизм.
Тот же код применяется к тому, что вы читаете из файла сериализации. Точно так же, как подсказка, вам нужно десериализовать объекты/примитивы в том же порядке, который вы их сериализовали.
object->Serialise()