问题标签 [forward-compatibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android 6.0 向后兼容
今天我在 Android M (6.0) 上测试我的一个应用程序。我了解此版本中的权限授予已更改,我需要进行一些更改以使我的应用程序与 Android 6.0 兼容(这里是详细信息)。
据我了解,例如,如果我想授予写入 sdcard(永恒存储)的访问权限,这是一个危险的权限,我必须要求用户授予访问权限,然后处理用户决定(授予/拒绝),否则我的请求总是得到总是被拒绝。
我不知道我是否正确,但我想知道它是否以某种方式反对向后兼容性?我的意思是在旧版本中运行的每个应用程序都需要更改才能在 6.0 版中运行?如果不再支持特殊的应用程序,那么android 6.0是我们应该说再见的地方吗?
在这种新环境下,我需要更改我的旧应用程序以使它们在 Marshmallow 中运行(如果它们需要危险的权限)?
c++ - 便携式支持宽松的循环范围
C++17 将(可能)放宽循环范围的定义,允许end()
返回不同的类型(例如哨兵):
目前支持此功能的唯一编译器是 gcc 6.1 和 clang 4.0+(示例)(错误消息示例)。如果我正在编写一个范围类型,其中哨兵对结束类型更有效,我如何检测编译器是否支持宽松范围?我在 P0184R0(上面链接)中看不到任何关于此的讨论;会提供功能测试宏吗?
进一步的问题:
- 如果有办法检测编译器支持,那么更改
end()
成员函数的返回类型是否安全(对于库而言)?我是否需要让我的哨兵隐式转换为我的迭代器类型? - 相反,对于 C++17 之前的编译器,是否值得以不同的名称(例如
sentinel()
)公开我的哨兵?C++17 之前的算法可以有效地使用[begin(), sentinel())
还是不值得额外的代码?
rest - 使用旧版本的实体类实现复杂 JPA 实体的部分更新
我有一个概念问题,我希望有人能回答。
我已经拥有了什么?
我有一个 RESTful 服务,它为单一类型的实体提供类似 CRUD 的操作。实体(我们称之为order)使用 Jackson 表示为 JSON。Jackson 注释直接附加到实体类,没有不同的数据传输层。实体类包含相当多的属性,一对一和一对多的关系。
在技术上,它基于 Wildfly 10、JAX-RS 2.0 和 JPA 2.1(使用 Hibernate 5)。
目前支持的操作是:
- GET通过使用
orders/123
读取实体EntityManager.find
- PUT通过使用或
orders/123
创建或替换实体EntityManager.persist
EntityManager.merge
代码示例
实体的简化版本如下所示:
JSON 表示形式如下所示:
我想做什么?
现在,我想将字段field2添加到 entity Order
。该服务有多个客户端 - Client1和Client2。
Client1执行实体更新并为新字段赋予值newValue:
Client2对新领域不感兴趣。因此,没有开发新版本的Client2。现在,它想将值更改为anotherNewValuefield1
值。由于它不知道新字段,因此它将以下 JSON 放入服务:field2
或者,Client1决定再次删除该值field2
。因为该值现在是空的,并且根据 Jackson 注释,不包括空值,所以正在 PUT 中:
问题是什么?
这个解决方案提供了一个严重的问题: 使用旧实体表示的客户端会意外删除它不知道的字段。
所以基本上它会破坏前向兼容性,这对我来说是一个大问题!
我有一些可能的解决方案,但每一个都有严重的缺点:
- 为实体的每次演变部署一个新版本的服务:简单且肯定会工作,但会导致必须同时维护大量版本。
- 为每个版本使用特定的媒体类型:这将允许客户端指定它引用的实体的版本。但是,我需要手动合并接收到的实体(考虑到哪些字段存在于哪个版本中)和数据库中的实体之间的差异。
- 带有部分更新的补丁:我可以将问题分为两个问题:
- 创建补丁(客户端):我必须手动比较修改前后的实体。
- 应用补丁(服务器):我必须从数据库中选择实体并手动应用补丁。
我在哪里需要你的帮助
我认为这是一个非常普遍的问题,所以我希望你们中的一些人已经做过这样的事情。我必须提出一些具体问题: 1. 有谁知道允许在任意对象树上创建和应用补丁的 Java 库(如解决方案 2 和 3 中所要求的)?2.有人有更简单的解决方案吗?
抱歉,文本变得这么长,但我想包括所有相关细节。非常感谢您的宝贵时间!
google-cloud-messaging - FCM 和 GCM 是否向后和向前兼容?
谷歌正在弃用谷歌云消息,转而支持Firebase 云消息:
Firebase 云消息传递 (FCM) 是 GCM 的新版本。它继承了可靠且可扩展的 GCM 基础架构,以及新功能!请参阅常见问题解答以了解更多信息。如果您要在新应用程序中集成消息传递,请从 FCM 开始。强烈建议 GCM 用户升级到 FCM,以便从现在和将来的新 FCM 功能中受益。
根据我在服务器上进行的一些测试,FCM URL ( https://fcm.googleapis.com/fcm/send ) 适用于 GCM 项目,反之亦然 - GCM URL ( https://android.googleapis.com /gcm/send ) 适用于 FCM 项目。
将所有现有的 GCM 推送发送代码迁移到 FCM 将节省很多麻烦和重构(我不必为每次推送检查应用程序版本是 FCM 还是 GCM)。
这种向后和向前兼容性是否得到官方支持或记录?
java - 被覆盖的 Java 方法即使存在也不会被调用
我需要确保我的应用程序与向我的应用程序扩展的超类引入新钩子方法的依赖项的前向兼容性。当我开始定义作为声明的子类型的返回类型时,引入新添加的方法(被我构建的旧版本忽略并被新版本使用)的直接方法停止工作。
当我直接调用我的重写方法作为foo.bar("")
超类方法被调用时。但是,当我通过 debugger 的反射调用它时foo.getClass().getMethod("bar", String.class).invoke(foo, "")
,它会按预期调用被覆盖的方法。当该方法的返回类型缩小到与被覆盖方法返回的相同类型时,该方法被正确调用,它之前是一个子类型。
assembly - 符号名称与新 NASM 版本中的新寄存器名称冲突?
想象一下,你在 10 年前写了这个(在英特尔 MPX和bnd0
..bnd3
寄存器甚至在路线图上之前):
您如何使用当前版本的 NASM 组装它? 即 NASM(或 YASM)是否与支持新寄存器名称的新版本具有前向兼容性?
显然,这很容易通过在单个文件或项目中搜索/替换来解决。但理论上,您可以将全局变量名作为库 ABI 的一部分,您可以从 NASM 导出或需要使用extern ymm0
. (必须声明外部符号,因此无法识别的寄存器名称永远不会汇编为符号引用。)
NASM 语法已经不适合作为 C 编译器输出的格式在不使用 an 前缀符号名称_
或进行一些其他类型的名称修饰(例如 Linux ELF)的平台上。您无法编译全局int eax = 1;
. 这就是 AT&T 语法%eax
用于寄存器名称的原因。对该答案的评论中的讨论激发了这个问题。请注意,GAS 不需要声明外部符号;无法识别的名称被视为符号(即使在.intel_syntax noprefix
使用类似于 MASM 的语法的模式下)。
相关:MASM 如何处理新扩展的前向源兼容性?
你能以某种方式禁用 MPX 支持吗?
YASM 支持一个CPU
指令,允许您禁用对某些助记符的支持,但即使禁用 AVX 支持也不允许您将ymm0
其用作符号名称。(YASM 1.3.0 不支持 AVX512 或 MPX,因此它可以汇编使用这些寄存器名称作为符号的代码,但它确实支持 AVX2。)
我明白了yasm-CPU.asm:2: error: directive 'extern' requires an identifier parameter
。或者ymm0: dd 123
,错误是yasm-CPU.asm:2: error: label or instruction expected at start of line
但是绝对禁用 AVX 支持:组装CPU Conroe
/vmovaps xmm0, [edi]
给出:
(它说CPU 686
或类似的旧禁用扩展。IDK 为什么它不说in CPU Sandybridge AVX
。似乎 yasm 不再得到很好的维护。YASM 1.3.0 支持CPU Haswell
and AVX2
,但文档没有提到它。)
此功能的目的是防止您在 SSSE3 或更低 CPU 的函数中意外使用 SSE4 指令,但显然它对解决此问题没有帮助。
NASM 的CPU
指令似乎是相似的,也根本没有帮助:
请注意,无论extern ymm0
有没有指令,它都可以很好地组装CPU
,但是一旦将其用作操作数,就会出现问题。
avro - Avro: Keep backwards capability using default value in new field without using writer/old schema
AVRO can handle most common forwards and backwards compatibility. But it somehow needs the writer schema when reading the data using a newer schema.
Saying there is a old schema:
If using the following new schema to decode bytes that written by old schema, it is needed to have both old and new schema.
The code to read
What I am trying is deserializing old bytes using new schema, WITHOUT old schema's help.
like:
But not
Is it supported in Avro?
protocols - 存储大小受限协议的前向兼容性
我有一个简单的协议,由 4 个字段组成:
目前,我组织它们,使它们字节对齐为:
消息总共占用 2 个字节,开销为 0 个字节。
为了使其向后兼容,以便我可以理解来自以前版本的消息,我在开头添加了一个 1 字节的版本字段,它变为:
总共 3 个字节,开销为 1 个字节。
如何添加前向兼容性,以便我可以在新版本的协议中添加新字段,同时确保旧版本的软件仍然可以理解消息,并且开销尽可能低?
opengl - LWJGL 3.1.6 OpenGL 4.1 在 macOS High Sierra 上崩溃
我在LWJGL 主页面上找到了示例代码的略微修改版本。它可以工作,但它使用旧的 OpenGL 版本2.1
。如果我尝试使用GLFW doc中描述的前向兼容上下文,则使用的版本是4.1
(无论我提示什么主要/次要版本),都会创建窗口,但它在第一次调用glPushMatrix()
.
像这样启用前向兼容性:
我在控制台中打印的一些信息:
记录:
从这里我不知道该寻找什么。这段代码应该工作吗?还是我错过了一些仪式?许多资源已经过时,因此更难弄清楚。
opengl - OpenGL奇怪的颜色
我们正在将我们的游戏从 OpenGL 2.1 升级到 3.1 核心(向前兼容)上下文。除了一个小但非常奇怪的故障外,这一切都很好。
我们有一个白色的填充纹理,它在 3D 世界加载后会以某种方式变为红色。即它在采样时开始在片段着色器中给出 vec3(1,0,0) 而不是 vec3(1,1,1)。
它只发生在 3.1 前向兼容的上下文中。兼容性 3.1 甚至核心 3.1 上下文都没有表现出这一点。没有总帐错误。而且,它发生在 Intel 和 nVidia GPU 上。
会是什么呢?