【问题标题】:Protocol abstraction in C#C# 中的协议抽象
【发布时间】:2010-06-17 16:50:48
【问题描述】:

有几十种网络协议和文件格式(WAV、TCP、BMP等)

是否有可用于在协议的实现和使用结果数据的代码之间创建抽象层的解决方案?

制作一个 WAV 文件。软件组件可以包含识别卡盘并将其解析为类的逻辑。该组件的用户不需要知道通道数是存储在两个字节还是四个字节中。

WAV 文件格式规范与数百种其他格式和协议并没有完全不同,那么为什么不制定一个通用的解决方案呢?为了创建更好的抽象,协议规范可以存储在 XML 中。我没有运气找到这样的东西。你能指出我正确的方向吗?

编辑: 这显然不是一个可以通过帖子轻松传达的问题。目前的答案并不是我真正想要的,但我要感谢大家至少试一试。

【问题讨论】:

  • 我认为您没有考虑的一个考虑因素实际上是您要解决的“问题”:有很多协议。他们中的许多人成为他们现在的样子是有原因的。为协议创建包装,只需创建另一个协议。
  • 我认为每个人都误解了这个问题。 OP 似乎在询问是否存在可以定义任意二进制结构的规范语言。
  • 不确定我是否理解这个问题,但听起来您要求的东西会根据 Xml 中定义的规范自动生成您的协议 IO 代码。我的关注正确吗?

标签: c# design-patterns protocols file-format abstraction


【解决方案1】:

这听起来很像泛化过度。这些格式和协议中的大多数都彼此如此不同,以至于它们的共同点只是存储在一个文件中。

即这些格式之间存在更多差异共性,并且大多数共性已经被标准库和/或操作系统抽象出来。因此,这看起来并不是一个非常实际的想法。

编辑:PS 看看http://www.codinghorror.com/blog/2004/12/it-came-from-planet-architecture.html,因为这感觉就像是在扮演建筑宇航员。

【讨论】:

    【解决方案2】:

    除非这是出于学术目的,否则我认为这样的抽象层不是一个好主意。

    根据数据的格式和数量,它会显着降低性能,以至于最好使用本机实现。此外,将 XML 用于规范会使您的性能问题更加严重。

    【讨论】:

    • 你怎么可能断定性能是不可接受的,仅仅因为会有一个抽象层呢?首先,当然,必须定义什么是“可接受的”性能?
    • OP 引用 WAV 作为其中一种格式。大多数专业音频程序都有充分的理由进行大量优化 - 音乐家通常必须同时播放许多不同的音轨,并且迟早 CPU 将被最大化。拥有一个额外的抽象层来对音频流进行转码肯定无济于事。对于视频格式,情况会变得更糟。
    【解决方案3】:

    大多数东西都可以封装在协议中——想想有多少东西被封装在了 URL 中。但这并不总是意味着结构真的被抽象成一个有意义的层。我认为协议和格式的多样性表明您可能可以抽象出一些类别,但没有一种抽象可以统治所有类别。

    例如,访问 IMAP 邮箱和打开 ZIP 文件之间可能存在显着差异,以至于几乎没有共同点。

    【讨论】:

    • 虽然我并不想一口气搞定所有内容,但您关于类别的评论是正确的。我认为这是对我的问题最明智的回答,因此值得一试。
    【解决方案4】:

    如果你把一些东西抽象得太远,它就会变得毫无用处,你必须打开黑匣子才能完成任何事情。

    保存声音文件、图像和电子表格的“通用”容器将毫无用处,因为无论如何您都将拥有处理特定于这些数据类型的内容的代码,但现在您面临着额外的负担通用容器废话。

    【讨论】:

    • 解析文件不需要知道它的内容。读取 BMP 标头类似于读取 TCP 标头:只需将一定数量的字节转换为结构。现在这是否有用是另一个问题,但我没有问过:)
    • @Mathijs 不,如果你想合理地解析它,你需要知道文件包含什么。您需要知道它的结构,如果您对正在查看的文件类型一无所知,您不能仅仅猜测您有 2 个 32 位整数还是 1 个 64 位整数。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多