哪个类应该负责序列化
Which class should be responsible for serialization?
本文关键字:序列化 更新时间:2023-10-16
我有一个非常普遍的问题,关于什么是更好的方法,为什么:让一个对象负责序列化自身,或者有一个单独的Reader
和Writer
类来做到这一点?
这是一个插图。我有一个文件格式,它由一个标题和一系列对象组成。
示例 #1 - 嵌入式序列化
class Header
{
friend std::ostream& operator<< (std::ostream& out, const Header& header);
friend std::istream& operator>> (std::istream& in, Header& header);
}
class Object
{
friend std::ostream& operator<< (std::ostream& out, const Object& object);
friend std::istream& operator>> (std::istream& in, Object& object);
}
class Reader
{
void readHeader(Header& header) { ifs_ << header; }
void readObject(Object& object) { ifs_ << object; }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { header >> ofs_ }
void writeObject(Object const& object) { object >> ofs_ }
private:
ofstream ofs_;
}
在这种情况下,所有序列化详细信息都将进入重载的<<
和>>
运算符。
示例 #2 - 外部序列化
class Header
{
}
class Object
{
}
class Reader
{
void readHeader(Header& header) { // serialization details go here }
void readObject(Object& object) { // serialization details go here }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { // serialization details go here }
void writeObject(Object const& object) { // serialization details go here }
private:
ofstream ofs_;
}
注意:我提供<<
和>>
运算符只是作为示例,这并不意味着我一定想将数据存储为文本。此方法也可以替换为使用二进制格式的serialize
/deserialize
方法。
简短回答:恕我直言,针对每个实体类的 Reader 类专用化将是一个更好的解决方案。
长答案:
可能序列化不应该是你的实体(即:标头)的问题,因此这个功能不应该属于它们(参见维基百科中的单一责任原则)。
另一方面,了解实体类的所有信息的外部序列化程序是系统中不允许的紧密耦合(可读性和可维护性将来会受到严重影响)。
因此,我的建议是创建读者/编写器泛化,这些泛化只知道如何序列化/反序列化特定的实体类(即:HeaderReader/HeaderWriter)。
[]的,
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?