1

我正在开发一个简单的系统,涉及序列化用户对象。我有一系列专门的模板类,它们作用于每种类型的读/写方式不同:

template<class T>
class ItemSerializer;

template<>
class ItemSerializer<int>
{
public:
    static void store( int const& obj )
    {
    }

    static void fetch( int& obj )
    {
    }
};

template<>
class ItemSerializer<NoteNumberArray>
{
public:
    static void store( NoteNumberArray const& obj )
    {
       // NoteNumberArray::_blocks is used here.
    }

    static void fetch( NoteNumberArray& obj )
    {
       // NoteNumberArray::_blocks is used here.
    }
};

根据类型,它可能有也可能没有状态,这对于分配它的序列化程序类是必需的。在这个例子中,我有 2 种类型的序列化器:intNoteNumberArray. 存储/获取功能不需要任何int类型的附加状态,读/写实现非常简单。

但是,对于NoteNumberArray,状态是必要的,所以我创建自己的类,而不是使用核心类型或 STL 类型。此状态仅由 的实现使用ItemSerializer 用于优化目的。这种私有状态将用于优化读/写方法的速度和效率。由于序列化程序类不是有状态的,我将这个状态放在用户对象中。

我可能会成为ItemSerializer的朋友NoteNumberArray,但这会导致循环依赖,并提供对不必要ItemSerializer的访问权限。NoteNumberArray

这样的系统有什么好的设计?只是寻找一些提示来帮助我开始。以下是此示例的其他一些相关片段:

class Block
{
};

class NoteNumberArray
{
public:
    // Public interface, none of which will use _blocks. Only ItemSerializer uses _blocks.

private:
    std::vector<int> _array; // This should not be used directly by anyone, including ItemSerializer.
    std::vector<Block> _blocks; // This is the private state only used by ItemSerializer
};
4

2 回答 2

2

我没有看到循环依赖问题,也没有ItemSerializer<NoteNumberArray>NoteNumberArray.

如果您不想ItemSerializer<NoteNumberArray>看到NoteNumberArray.

一种可能性是包装_blocks到另一个类NoteNumberArraySerializerHelper中,该类ItemSerializer<NoteNumberArray>作为友元和所有方法(包括构造函数和其他通常由编译器为您编写的东西)都是私有的。然后,您必须为 to 提供公共访问器/修改器方法,_blocksNoteNumberArray除了这些方法之外,没有人ItemSerializer<NoteNumberArray>可以使用这些方法来做任何事情。

于 2013-02-07T17:21:25.063 回答
0

If_blocks仅用于ItemSerializer使其成为ItemSerializer专业化的成员。在不了解整个目的的情况下,我看不到NoteNumberArray直接存储这样的东西的好处。

附带说明一下,通过避免_在标识符上前导,您可以轻松避免意外使用保留名称(例如_后跟大写或_在全局命名空间中前导)。

于 2013-02-07T16:32:02.537 回答