Полиморфизм и сериализация с помощью Marmalade SDK

0

У меня проблема с сериализацией с использованием 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
}
Теги:
polymorphism
oop
serialization
marmalade

1 ответ

0

чтобы использовать это для вызова нового в одном из конкретных подклассов. Например -

//Writing - 
AbstractClass *object = new ConcreteClass();
object->Serialise();

Где ConcreteClass является конкретным подклассом AbstractClass. Теоретически вы не должны иметь объект только класса Abstract, если не используете полиморфизм.

Тот же код применяется к тому, что вы читаете из файла сериализации. Точно так же, как подсказка, вам нужно десериализовать объекты/примитивы в том же порядке, который вы их сериализовали.

  • 0
    Я понимаю это, но я не знаю, каким будет конкретный класс во время выполнения, это моя проблема. При чтении объект еще не был создан. Мне нужно создать его (зная, какой конкретный класс это было, когда он был сериализован), а затем вызвать object->Serialise()
  • 0
    Простым решением было бы иметь отдельную строковую переменную или enum в файле сериализации непосредственно перед фактическим сериализованным объектом, который хранит имя конкретного класса. При десериализации вы можете определить, какой класс является конкретным классом, и соответственно инициализировать объект.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню