Сериализация для разных абстрактных классов с множеством наследников

Как записать и прочесть наследников разных абстрактных классов?

#include <iostream>
#include <fstream>
#include <vector>
#include <cassert>

// ============================================================================
//  Bases
// ----------------------------------------------------------------------------
class Base1 {
public:
    virtual void func1() = 0;
};
class Base2 {
public:
    virtual void func2() = 0;
};
class Base3 {
public:
    virtual void func3() = 0;
};

// ============================================================================
//  Derived
// ----------------------------------------------------------------------------
class Derived11 : public Base1 {
public:
    void func1() override {
        std::cout << 11 << std::endl;
    }
};
class Derived12 : public Base1 {
public:
    void func1() override {
        std::cout << 12 << std::endl;
    }
};

class Derived21 : public Base2 {
public:
    void func2() override {
        std::cout << 21 << std::endl;
    }
};
class Derived22 : public Base2 {
public:
    void func2() override {
        std::cout << 22 << std::endl;
    }
};

class Derived31 : public Base3 {
public:
    void func3() override {
        std::cout << 31 << std::endl;
    }
};
class Derived32 : public Base3 {
public:
    void func3() override {
        std::cout << 32 << std::endl;
    }
};

// ============================================================================
//  Serialization
// ----------------------------------------------------------------------------
template <typename _Ty>
void Write(std::ostream& Stream, _Ty Container) {
    size_t Size = Container.size();
    Stream.write(reinterpret_cast<const char*>(&Size), sizeof(Size));

    if (Size > 0)
        for (auto Value : Container)
            Stream.write(reinterpret_cast<const char*>(&Value), sizeof(Value));
}
template <typename _Ty>
void Read(std::istream& Stream, _Ty& Container) {
    size_t Size;
    Stream.read(reinterpret_cast<char*>(&Size), sizeof(Size));

    Container.clear();
    for (size_t i = 0; i < Size; ++i) {
        typename _Ty::value_type Value = { }; // Value - is nullptr
        Stream.read(reinterpret_cast<char*>(&Value), sizeof(Value));
        Container.push_back(Value);
    }
}

// ============================================================================
//  Main
// ----------------------------------------------------------------------------
int main() {
    std::vector<Base1*> Vector1;
    Vector1.push_back(new Derived11);
    Vector1.push_back(new Derived12);

    std::vector<Base2*> Vector2;
    Vector2.push_back(new Derived21);
    Vector2.push_back(new Derived22);

    std::vector<Base3*> Vector3;
    Vector3.push_back(new Derived31);
    Vector3.push_back(new Derived32);

    // Write
    std::fstream File("file.a", std::ios::out);
    assert(File.is_open());
    Write(File, Vector1);
    Write(File, Vector2);
    Write(File, Vector3);
    File.close();

// 
//  ...
// 

    // Read
    File.open("file.a", std::ios::in);
    assert(File.is_open());
    Read(File, Vector1);
    Read(File, Vector2);
    Read(File, Vector3);
    File.close();
    return 0;
}

Ответы (0 шт):