簡體   English   中英

谷物添加序列化到現有庫 Class

[英]Cereal Add Serialize to Existing Library Class

我正在嘗試在 SFML 庫中添加對現有 class 的串行支持。 我正在嘗試保存 colors 以便稍后加載。 從文件中可以看出,谷物很容易擴展到其他類型,但我不知道該怎么做。 除非創建一個 SerialColor class 並在其中重新實現 sf::Color 並在其中添加一個序列化成員,有沒有辦法做到這一點? 我真的不想從 SFML 重寫我需要的 5 個可序列化的類。

我正在將 Color 轉換為 SerialColor,到目前為止已經實現了以下目標:

序列顏色.hpp

#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/Config.hpp>


class SerialColor: sf::Color
{
public:

    static const SerialColor Black;       ///< Black predefined color
    static const SerialColor White;       ///< White predefined color
    static const SerialColor Red;         ///< Red predefined color
    static const SerialColor Green;       ///< Green predefined color
    static const SerialColor Blue;        ///< Blue predefined color
    static const SerialColor Yellow;      ///< Yellow predefined color
    static const SerialColor Magenta;     ///< Magenta predefined color
    static const SerialColor Cyan;        ///< Cyan predefined color
    static const SerialColor Transparent; ///< Transparent (black) predefined color

    SerialColor(sf::Uint8 red, sf::Uint8 green, sf::Uint8 blue, sf::Uint8 alpha = 255);

private:

    SerialColor(sf::Color c);
    
    sf::Color color;

    template<class Archive>
    void serialize(Archive& archive, std::uint32_t const version) {
        archive(CEREAL_NVP(this->color.r),
                CEREAL_NVP(this->color.g),
                CEREAL_NVP(this->color.b)
        );
    }
};




序列顏色.cpp

#include "SerialColor.h"




SerialColor::SerialColor(sf::Uint8 red, sf::Uint8 green, sf::Uint8 blue, sf::Uint8 alpha = 255) {
    this->color = sf::Color(red, green, blue, alpha);
}


SerialColor::SerialColor(sf::Color c) {
    this->color = sf::Color(c);
}

這目前還沒有完全實現,所以它不起作用。 然而,將 1 function 添加到 class 感覺有點矯枉過正。 如果擴展是正確的方法,您能否提供被認為是添加此功能的正常方法? 這只是感覺不對。

您可以為谷物提供 function 告訴它如何序列化您的自定義數據類型,而不是嘗試直接擴展 class,例如:

namespace cereal {
    template<class Archive>
    void serialize(Archive& archive, sf::Color c) {
        archive(CEREAL_NVP(c.r),
                CEREAL_NVP(c.g),
                CEREAL_NVP(c.b)
    );
}

您可以選擇將類似上述代碼的內容添加到您自己的 header 文件(類似“Serialize.hpp”)並包含它而不是谷物.hpp,或者您可以直接擴展您的谷物標題(即類似cereal/types/sf_color.hpp )。

這真的取決於你把這段代碼放在哪里,但只要它是可見的,谷物將自動能夠序列化 sf::Color 類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM