C:使用序列化数据作为类型

时间:2014-04-04 14:23:57

标签: c design-patterns serialization

所以我遇到了一个有趣的设计模式,我想知道你们是否有意见。

基本上,设计将所有内容作为预序列化类型传递。没有"类型"例如,为了回报。它作为一个简单的uint8_t *传递。有一个定义的标题,"告诉"你在缓冲区里面的东西,它有多大,缓冲区的版本是什么,等等。我称之为"预先序列化"因为它迫使所有结构变平。

专业人士:

  1. 您可以轻松地将它(甚至一组)写到您想要的任何地方。文件,IO,等等。
  2. 可以存储任意数据。
  3. 缺点:恕我直言:

    1. 没有类型安全将是一场噩梦
    2. 程序员必须解析代码。即使存在枚举类型,用户也必须知道该类型的含义。即使有解析类型的函数,程序员也必须知道这是要调用的函数。
    3. 版本地狱:更改代码会导致错误的连锁反应。因为每个地方都以不同方式解析它,所以您不知道代码在哪里工作或在哪里被破坏。
    4. 它是病毒的:因为它是扁平的,你不能插入"外部数据末尾的标题。如果您复制"数据",您可以打包电话,但这可能会导致不必要的副本变​​慢。因此,您的代码要么比它需要的慢,要么符合这种数据结构。
    5. 它不是人类可读或可调试的。
    6. 你以前见过这种设计模式吗?这个设计模式有名字吗?我错过了什么?

1 个答案:

答案 0 :(得分:1)

  

这个设计模式有名称吗?

那么,遗产代码? :)我在30年前的Cobol系统中看到过这样的设计......

使用 XML格式(或JSON)也可以轻松访问您所说的专业人士:

  1. 您可以轻松地将它(甚至一组)写到您想要的任何地方。文件,IO,无论如何 - 最重要的是, Web服务
  2. 可以存储任意数据。
  3. 此外,你的所有缺点都被淘汰了。

    我能在您的解决方案中看到的唯一专家是简洁 - 当每个字节都很重要且你需要避免任何开销太昂贵时,那就很好了。

    已添加: Cobol 具有轻松定义此类序列化数据结构的功能,请参阅PICTURE子句。读取数据非常简单,您可以将它们作为变量读取。 (就像你有二进制数据并在C语言中定义 struct 并将二进制类型转换为 struct 。)