问题 用于C ++的Python风格的酸洗?


有没有人知道在C ++中进行酸洗的“语言级”设施?我不想要像Boost序列化或Google Protocol Buffers这样的东西。相反,可以自动序列化类的所有成员的东西(可以选择排除某些成员,因为它们不可序列化,或者因为我不想在以后保存它们)。这可以通过在解析时执行额外操作来完成,这将生成用于处理自动序列化的代码。有没有人听说过这样的事情?


6636
2017-11-10 21:07


起源



答案:


我不相信在没有运行时内省功能的语言中有任何方法可以做到这一点。


7
2017-11-10 21:13



正如Jacob在下面所说,我只是想知道是否有人看过一个可以解决这个问题的编译时工具。我想那里没有那样的东西。 - Roni Choudhury
@RoniChoudhury除非我弄错了,否则鉴于语言的限制,Boost序列化工作做得很好。 - Marcin
@Marcin - Boost.Serialize确实做得很好,但你必须写一个 serialize() 知道要序列化的对象的详细信息的函数。 - Ferruccio
@ferruccio虽然这正是可以自动生成的东西。 - Marcin


答案:


我不相信在没有运行时内省功能的语言中有任何方法可以做到这一点。


7
2017-11-10 21:13



正如Jacob在下面所说,我只是想知道是否有人看过一个可以解决这个问题的编译时工具。我想那里没有那样的东西。 - Roni Choudhury
@RoniChoudhury除非我弄错了,否则鉴于语言的限制,Boost序列化工作做得很好。 - Marcin
@Marcin - Boost.Serialize确实做得很好,但你必须写一个 serialize() 知道要序列化的对象的详细信息的函数。 - Ferruccio
@ferruccio虽然这正是可以自动生成的东西。 - Marcin


也许是xml 数据绑定gSOAP的 只是众多选择中的一种。您可以自动生成用于在数据结构和xml架构之间进行映射的代码。不确定设置它会比你提到的其他选项更容易


3
2017-11-10 21:15





可以自动的东西   序列化一个类的所有成员

这在C ++中是不可能的。 Python,C#,Java等。使用运行时内省来实现这一目标。你不能用C ++做到这一点,RTTI不够强大。

从本质上讲,C ++语言中没有任何东西可以让某人在运行时发现对象的成员变量。没有它,您无法自动序列化它们。


3
2017-11-10 21:53





有使用<<和>>运算符的标准C ++序列化,尽管你必须为每个类实现这些(听起来你不想这样做)。一些从业者说你应该总是实施这些操作员,当然,我们大多数人很少这样做。


1
2017-11-10 21:12





当我需要将结构保存到文件时,我执行此操作的一种快速方法是将我的结构转换为 char 数组并将其写入文件。然后,当我想重新加载我的结构时,我将读取整个文件(以二进制模式),并将整个内容转换为我的结构类型。足够简单并利用结构存储为内存中的连续块的事实。不过,我不希望这会与复杂的数据结构或指针一起工作,但值得深思。


0
2017-11-10 21:50



这既古老又极端 较差的 序列化策略在任何条件下都会失败,例如:不同的编译器标志,不同的编译器版本,不同的CPU(甚至不一定是不同的架构!),不同的操作系统...... - Nicholas Knight