【问题标题】:Is there a correct pattern when designing network layer to easily allow upgrades/backwards compatibility?在设计网络层以轻松实现升级/向后兼容性时,是否有正确的模式?
【发布时间】:2011-09-27 20:46:13
【问题描述】:

我目前正在编写 iPhone 应用程序的网络层和随附的服务器。 iPhone 应用程序在主机模式和访客模式下运行,并且还与服务器通信,用于在设备之间通过 3G 中继消息。两者都是用 C# 编写的,并且我使用套接字。出于速度和效率的原因,我想坚持使用二进制通信。

是否有正确的设计方法来设计网络层,特别是在服务器和客户端之间传输的数据包?

我是否应该创建一个基类作为我的第一个版本,它允许系统的基本操作,然后从该基类继承以用于将来的版本和更改,并将其序列化?

我知道 XML 是一种选择,但我做了一些测试,iPhone 上的 XML 序列化比二进制序列化慢几个数量级,最终,网络层的部分需要是二进制的,因为我在设备之间发送文件。

我的应用需要向后和向前兼容不同的版本。我不希望将来对功能有大的变化,但可能会有某种形式的新功能。

我读过这个问题:Backwards compatibility in .NET with BinaryFormatter

最后一个答案似乎是最好的选择,使用“手动”反序列化和序列化方法。我只是想知道这是唯一的选择。

【问题讨论】:

    标签: c# iphone client-server


    【解决方案1】:

    抱歉,您的问题太模糊了。你需要做一些阅读并提出一些更清晰的问题。

    听起来您确实打算使用 C#,它不适用于 iOS 设备。因此,您将不得不为设备和服务器编写单独的代码。鉴于此,网络数据包的结构(XML 或二进制)不会那么重要,因为它们在两个系统上的处理方式不同。

    我认为大多数人都会推荐使用 XML 或 JSON 工作,这仅仅是因为它们具有广泛的支持,并且使用某些自定义二进制格式更容易。它们是否比二进制形式慢在很大程度上取决于您的数据。我们总是首先问的一个古老的问题 - 差异是否足够明显,足以保证额外的努力。在大多数情况下,可能不是。人们有时倾向于过分强调速度的必要性,没有意识到除非您有大量数据要传输,否则您的网络连接,而不是您的数据包格式,将成为限制因素。

    因此,我可能会计算等式的每一端(服务器 C# 和 iPhone Objectice C)的方式是创建一个单独的类来管理通信和一个或多个类来处理序列化/反序列化。这使您可以根据需要灵活地更换技术。

    【讨论】:

    • 我猜这个问题与 Mono Touch 有关。 (monotouch.net) - 这是用于 iPhone 的 C#。
    • 如原始问题中所述,两者都是用 C# 开发的(有关更多详细信息,请参阅 Xamarin.com)。速度是一个问题,因为将传输音频文件和图像等二进制数据。我的应用程序已经完全面向对象,其中网络代码与其他逻辑完全分离。虽然我很欣赏你的回答,但这不是我问题的答案;向后兼容的二进制网络数据包的最佳方法是什么?自发布此消息以来,我认为我会将项目存储在弱类型数组中,然后进行序列化。连同版本号。嵌入的数据包。
    • 我已经将其更改为 JSON。我为 iPhone 和 .NET 使用 Newtonsoft 的 JSON.NET。很棒的图书馆。
    猜你喜欢
    • 2013-05-18
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2020-06-19
    相关资源
    最近更新 更多