Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中序列化类+; 有一种方法在C++中序列化一个类吗?我指的不是类的实例,而是类本身。当反序列化时,我不知道实例化哪个类来调用反序列化。我希望能够以某种方式确定所表示的类,实例化它的空实例,然后调用反序列化_C++_Templates_Serialization_Deserialization - Fatal编程技术网

在C+中序列化类+; 有一种方法在C++中序列化一个类吗?我指的不是类的实例,而是类本身。当反序列化时,我不知道实例化哪个类来调用反序列化。我希望能够以某种方式确定所表示的类,实例化它的空实例,然后调用反序列化

在C+中序列化类+; 有一种方法在C++中序列化一个类吗?我指的不是类的实例,而是类本身。当反序列化时,我不知道实例化哪个类来调用反序列化。我希望能够以某种方式确定所表示的类,实例化它的空实例,然后调用反序列化,c++,templates,serialization,deserialization,C++,Templates,Serialization,Deserialization,编辑澄清: 我正在创建一个键值结构,其中每个键都有一个强类型值。(有些键必须存储字符串,有些键必须存储整数,还有一些键可能存储任意值)。我设计了一个系统,编译器通过模板来实现这一点 Key类有两个模板参数: UniqueClass-每个概念应有一个唯一的类(通常在定义概念的预处理器函数中定义) ValueType-这是该概念的值必须为的类 Value类是一个模板类,它只有一个ValueType,这个ValueType有一个抽象的超类,因此我可以在其中包装任何类(类似于boost::any)

编辑澄清:

我正在创建一个键值结构,其中每个键都有一个强类型值。(有些键必须存储字符串,有些键必须存储整数,还有一些键可能存储任意值)。我设计了一个系统,编译器通过模板来实现这一点

Key类有两个模板参数:

  • UniqueClass-每个概念应有一个唯一的类(通常在定义概念的预处理器函数中定义)
  • ValueType-这是该概念的值必须为的类
Value类是一个模板类,它只有一个ValueType,这个ValueType有一个抽象的超类,因此我可以在其中包装任何类(类似于boost::any)

然后,在我的键值结构中,我使用ConceptType和ValueType模板存储和检索函数:

template<UniqueClass, ValueType>
void store( Concept<UniqueClass, ValueType> concept, ValueType value );
模板
无效存储(概念、值类型、值);
因为我使用相同的模板来描述概念的值类型和传入的值,如果它们不匹配,编译器会抱怨

我现在希望能够序列化键值存储。因此,我需要以某种方式序列化模板化的概念类,然后在反序列化期间实例化正确的任意类


我拥有它,因此我可以调用serialize,并要求所有适当的对象进行自身序列化,我只是不知道在反序列化过程中要实例化哪个类以要求反序列化自身。

由于问题编辑,答案更新:

据我所知,在手动或通过反序列化添加之前,容器中有0个密钥。有两种方法可以做到这一点:侵入式和非侵入式

侵入性的

概念
继承自
反序列化

class Deserializable
{
    public:
        virtual void deserialize(InputStream& s) = 0;
        virtual int getClassId() const = 0;
};
现在,您可以通过使用
getClassId()
检索的id来识别类。所以,下一步是创建一个工厂。在这里,我将使用一个非常简单的方法,使用
std::map
,来说明这一点;请随意使用更复杂的

typedef Deserializable* (*createDeserializableType)();
std::map<int,createDeserializableType> factory;

// ...

factory[id1] = &createMyClass;
// etc...

// ...

// On deserialization
createDeserializable create = factory[idReadFromStream];
if(create)
    create()->deserialize(input_stream);
反序列化
方法将在创建反序列化类型后立即存储该类型


你的问题中不清楚的是,被接受的列表是有限的还是无限的。只有有限的类型集是“容易”序列化的。

请解释“序列化类”的含义。序列化什么,定义(方法/字段)?静态成员?显示一些您正试图工作的非工作代码。您的问题并不能立即弄清楚,但您似乎在要求两件不同的事情。1) 如何确定要反序列化的类的类型(这将需要一些序列化的元数据并可能使用某种类型的工厂模式),以及2)如何实际序列化内容(可以通过多种方式完成)。这里有一些示例可以帮助您开始:您的一个序列化字段将需要一些元数据信息,以便您可以确定要实例化的正确类型。我将给出一个示例答案。您的概念是一个关系
唯一类值类型
。一个
唯一类是否可以与多个
值类型关联?
?答案很好,正是我要建议的(所以现在我不是):)
typedef void (*deserializeFctType)(InputStream&);
typedef int id_type;
std::map<id_type,deserializeFctType> factory;