我通常在C#编写代码的所有部分,编写序列化的协议时,我使用FastSerializer快速和有效地序列化/反序列化类。 这也很容易使用,而且相当直接的做“版本化”,即处理不同版本的序列化。 我通常使用的东西看起来像这样: public override void DeserializeOwnedData(SerializationReader reader, object context) { base.DeserializeOwnedData(reader, context); byte serializeVersion = reader.ReadByte(); // used to keep what version we are using this.CustomerNumber = reader.ReadString(); this.HomeAddress = reader.ReadString(); this.ZipCode = reader.ReadString(); this.HomeCity = reader.ReadString(); if (serializeVersion > 0) this.HomeAddressObj = reader.ReadUInt32(); if (serializeVersion > 1) this.County = reader.ReadString(); if (serializeVersion > […]
我看了一下API版本的最佳实践? ,但是我不太相信答案,所以我再次以更具体的例子来质疑版本控制部分。 我有两个URI(一个版本是URI的一部分,另一个没有): http://xxxx/v1/user/123 -> favored solution in discussed thread http://xxxx/user/123 我怀疑第一个链接是否expression了REST的想法。 我发现http://xxxx/v1/user/123令人困惑,因为它暗示有一天会有一个更高的api版本,像http://xxxx/v2/user/123 。 但是这在REST术语中没有意义,api版本本身就是HTTP 1.0或1.1,它已经在HTTP请求中发送了。 这个以REST资源为中心的视图与其他api接口(如SOAP或Java接口(通常在限定名称中包含api-versions))之间的差别很大。 在REST中,版本控制唯一有意义的是该资源的表示(例如添加或删除新的字段)。 这个版本控制属于内容协商的部分,如: http://xxx/user/123 + HTTP 'Accept' Header -> Content negotation through header http://xxx/user/123?v=1 -> for perma-links/hyperlinks 人们也可以争辩说,这样的版本内容协商可能是path中的URI的一部分,但是我觉得它是违反直觉的,因为你可能以同一资源的不同的URI结束,并且必须在某个时刻保持redirect。 综上所述:在REST URI中没有api版本化,只有资源表示的版本。 表示版本信息属于内容协商(作为queryParam或HTTP“接受”)。 你怎么看? 你会不同意/同意哪些事情?
我一直在阅读关于ReST API的版本控制策略,而且他们似乎没有解决的是如何pipe理底层代码库。 比方说,我们正在对API进行一些重大更改 – 例如,更改我们的客户资源,以便返回单独的forename和surname字段,而不是单个name字段。 (在这个例子中,我将使用URL版本解决scheme,因为它很容易理解所涉及的概念,但是这个问题同样适用于内容协商或自定义的HTTP头部) 我们现在在http://api.mycompany.com/v1/customers/{id}有一个端点,在http://api.mycompany.com/v1/customers/{id}另一个不兼容的端点。 我们仍在向v1 API发布错误修正和安全更新,但新function开发现在都集中在v2上。 我们如何编写,testing和部署对我们的API服务器的更改? 我可以看到至less有两个解决scheme: 为v1代码库使用源代码控制分支/标记。 v1和v2是独立开发和部署的版本控制合并,在两个版本中都使用相同的修补程序 – 类似于在开发新版本时如何pipe理原生应用程序的代码库,同时还支持以前的版本。 使代码库本身意识到API版本,所以你最终得到一个包含v1客户表示和v2客户表示的代码库。 将版本控制视为解决scheme架构的一部分,而不是部署问题 – 可能使用命名空间和路由的某种组合来确保请求由正确的版本处理。 分支模型的一个明显的优点是删除旧的API版本是很简单的 – 只要停止部署相应的分支/标签 – 但是如果你运行的是多个版本,那么最终可能会有一个非常复杂的分支结构和部署pipe道。 “统一的代码库”模式避免了这个问题,但是(我认为呢?)会使代码库中被废弃的资源和端点不再需要的时候更难。 我知道这可能是主观的,因为这不太可能是一个简单的正确答案,但我很好奇,要了解在多个版本中维护复杂API的组织是如何解决这个问题的。
作为我们构build过程的一部分,我需要为所有编译的二进制文件设置版本信息。 一些二进制文件已经有版本信息(在编译时添加),有些则没有。 我希望能够应用以下信息: 公司名 版权声明 产品名称 产品描述 文件版本 产品版本 所有这些属性都由构build脚本指定,并且必须在编译之后应用。 这些是用C ++ Builder 2007编译的标准二进制文件(不是程序集)。 我怎样才能做到这一点?