Ускорение отсутствия некоторых данных в процессе сериализации - PullRequest
1 голос
/ 20 сентября 2019

В моей настройке у меня есть вектор указателя OpacityChannel как члена класса Container.

, если я создаю переменную OpacityChannel и записываю ее в архив, тогда все записывается как ожидалось.

когда я пишу объект класса Container и записываю его в архив, он пропускает данные для класса KeyframeFloat, который является членом класса OpacityChannel.

Это мой основной файл, если я изменяю строку с ar & cont;в ar & opacityChannel, чем он записывает данные по мере необходимости.

Я не могу понять, почему он пропускает данные, когда я пишу класс контейнера.

#include "pch.h"
#include <iostream>
#include<fstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include "Container.h"
#include "KeyframeFloat.h"
#include <boost/serialization/export.hpp>


BOOST_CLASS_EXPORT_GUID(SumOpacity_Channel, "SumOpacity_Channel")
BOOST_CLASS_EXPORT_GUID(SumKeyframeFloat, "SumKeyframeFloat")

int main()
{
    const char* fileName = "saved.txt";
    std::vector<int> vec;
    Container cont;
    SumOpacity_Channel opacityChannel;
    SumKeyframeFloat key1, key2;
    opacityChannel.AddKeyframe(key1);
    opacityChannel.AddKeyframe(key2);
    cont.AddChannel(&opacityChannel);   
    SumKeyframeFloat key1_Restored, key2_Restored;

    {
        // Create an output archive
        std::ofstream ofs(fileName);        
        boost::archive::text_oarchive ar(ofs);  
        ar & cont; // KeyframeFloat data is not written.

        // if i do ar & opacityChannel; than keyframeFloat data is written in archive

    }

    Container c_Restored ;
    SumOpacity_Channel opacityChannel_Restored;

    //load data
    {
        //create an input stream
        std::ifstream ifs(fileName);        
        boost::archive::text_iarchive ar(ifs);
        ar & c_Restored ;
    }   

    do
    {
        std::cout << '\n' << "Press a key to continue...";
    } while (std::cin.get() != '\n');
} 

Это контейнер класса

#pragma once

#include <boost/serialization/base_object.hpp>
#include <boost/serialization/split_member.hpp>
#include "SumChannel.h"
#include "SumOpacityChannel.h"
#include <boost/serialization/vector.hpp>
#include <memory>
#include <boost/serialization/export.hpp>



class Container
{
private:
    std::vector< SumOpacity_Channel* > Channels;

public:

    Container() {} ;

    ~Container()
    {
        if(Channels.size() > 0 )
            for (int i = 0; i < Channels.size(); i++)
            {
                delete Channels[i];
            }
    }




    Container(const Container& c)
    {
        if (Channels.size() > 0)
            Channels.clear(); // clear any previous channels

        for (int i = 0; i < c.Channels.size(); i++)
        {
            Channels.push_back(c.Channels[i]->Clone());
        }

    }

    Container& operator=(const Container& c) 
    {
        if (Channels.size() > 0)
            Channels.clear(); // clear any previous channels

        for (int i = 0; i < c.Channels.size(); i++)
        {
            Channels.push_back(c.Channels[i]->Clone());
        }
        return *this;
    }


    void AddChannel(SumOpacity_Channel* channel)
    {
        Channels.push_back(channel->Clone());
    }


private:

    friend class boost::serialization::access;

    template <typename Archive>
    void save(Archive& ar, const unsigned version) const {
        ar  & Channels;
    }

    template <typename Archive>
    void load(Archive& ar, const unsigned version) {

        ar  & Channels;
    }

    BOOST_SERIALIZATION_SPLIT_MEMBER()

};

Это класс keyframeFloat.

#pragma once
#include "KeyframeBase.h"
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/serialization.hpp>

class SumKeyframeFloat
{
private:
    float x;

public:

    SumKeyframeFloat() { this->x = 0.0; };
    SumKeyframeFloat(float xvalue) : x(xvalue) { };
    SumKeyframeFloat(const SumKeyframeFloat& key) : x ( key.x) { };
    ~SumKeyframeFloat() = default;

private:

    friend class boost::serialization::access;

    template<typename Archive>
    void save(Archive& ar, const unsigned int version) const {
        std::cout << "writing float keyframe to Archive" << std::endl;

        ar & x;
    }

    template<typename Archive>
    void load(Archive& ar, const unsigned int version) {


        ar & x;
    }

    BOOST_SERIALIZATION_SPLIT_MEMBER()

};

Это сумма заголовка и определения класса непрозрачности

#include <string>
#include "SumChannel.h"
#include <iostream>
#include <vector>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>

class SumOpacity_Channel 
{
private:
    std::vector<SumKeyframeFloat>  keyframes;

public:
    SumOpacity_Channel();
    SumOpacity_Channel(const SumOpacity_Channel &opacityChannel);
    ~SumOpacity_Channel() = default;
    SumOpacity_Channel& operator=(const SumOpacity_Channel &posChannel);
    void AddKeyframe(SumKeyframeFloat key);
    void DeleteKeyframe(SumKeyframeFloat key, int number);
    SumOpacity_Channel* Clone() const;


public:
    friend class boost::serialization::access;

    template<typename Archive>
    void save(Archive& ar, const unsigned int version) const {  
        ar & keyframes;
    }

    template<typename Archive>
    void load(Archive& ar, const unsigned int version) {
        ar & keyframes;
    }


    BOOST_SERIALIZATION_SPLIT_MEMBER()

};

///////////////////////////////////////////////////

#include "pch.h"
#include "SumOpacityChannel.h"


SumOpacity_Channel::SumOpacity_Channel() 
{

}
/////////////////////////////////////////////////////////////////////////////////////////////

    SumOpacity_Channel::SumOpacity_Channel(const SumOpacity_Channel &opacityChannel) 
    {
        this->keyframes.clear();
        for (auto KeyFrame : keyframes)
        {
            this->keyframes.push_back(KeyFrame);
        }
    }

    SumOpacity_Channel& SumOpacity_Channel::operator=(const SumOpacity_Channel &opacityChannel)
    {   
        for (auto KeyFrame : keyframes)
        {
            this->keyframes.push_back(KeyFrame);
        }
        return *this;
    }

    void SumOpacity_Channel::AddKeyframe(SumKeyframeFloat key)
    {
        keyframes.push_back(key);
    }

    void SumOpacity_Channel::DeleteKeyframe(SumKeyframeFloat key, int number)
    {
        keyframes.erase(keyframes.begin() + number);
    }

    SumOpacity_Channel* SumOpacity_Channel::Clone() const
    {
        return  new SumOpacity_Channel(*this);
    }

1 Ответ

1 голос
/ 20 сентября 2019

Ваш канал пуст.

Этот конструктор копирования не имеет никакого смысла:

 SumOpacity_Channel::SumOpacity_Channel(const SumOpacity_Channel &opacityChannel) 
    {
        this->keyframes.clear(); // [1]
        for (auto KeyFrame : keyframes) // [2]
        {
            this->keyframes.push_back(KeyFrame);
        }
    }

в [2] вы перебираете пустой вектор - он был очищен строкой выше,И почему clear называется?Это конструктор, поэтому этот вектор не может быть заполнен никогда.Вызов clear имеет смысл в операторе присваивания копии, но не здесь.

Так что

cont.AddChannel(&opacityChannel);   

с этим

void AddChannel(SumOpacity_Channel* channel)
{
    Channels.push_back(channel->Clone());
}

SumOpacity_Channel* SumOpacity_Channel::Clone() const
{
    return  new SumOpacity_Channel(*this);
}

дает пустой вектор.


auto KeyFrame : keyframes

должно быть

auto KeyFrame : opacityChannel.keyframes

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...