使用 Composer 在不破坏兼容性的情况下更新业务网络的指南?

Guidelines of updating business network without breaking compatibility using Composer?

因为更新业务网络可能会破坏您的 API,并且您可能无法获取旧数据。我们正在寻找关于在更新业务网络和使用 composer 进行部署之前应该注意什么的通用指南。

我们将把它包含在下周发布的文档中...


模型兼容性

简介

作曲家模型预计会随着时间的推移而改变和发展。但是,在进行模型更改时必须小心谨慎,以确保现有实例对于新模型仍然有效。

如果使用模型 M 创建的实例对于模型 M' 有效,则模型 M' 与模型 M 兼容。如果实例有效,则可以使用 Serializer.

反序列化它们

术语

本文档通篇使用以下术语:

  • Class : 资产、参与者、交易、概念或事件的结构声明
  • 实例:class的一个实例,例如如果org.example.Vehicle是一个资产(class),那么org.example.Vehicle#ABC123 是 org.acme.Vehicle
  • 实例
  • 属性 :由 class 定义的成员(或字段),包括关系。例如 class org.example.Vehicle 可能有一个名为 model 的 属性 类型 string.

A class(资产 SampleAsset):

``` 命名空间 org.acme.sample

assetId 标识的资产 SampleAsset { o 字符串 assetId --> SampleParticipant 所有者 o 字符串值 } ```

class的实例:

{ "$class": "org.acme.sample.SampleAsset", "assetId": "assetId:6463", "owner": "resource:org.acme.sample.SampleParticipant#participantId:8091", "value": "secret plant frequently ruler" }

命名空间的演变

可以将新的 class 添加到命名空间,而不会破坏与现有实例的兼容性。

Classes

的进化

本部分描述了更改 class 声明及其对现有实例的属性的影响。

正在重命名

重命名 class 将破坏与 class 任何预先存在的实例的兼容性或与 class 的关系。

摘要Classes

如果将未声明为抽象的 class 更改为声明为抽象,则尝试创建该 class 的新实例将在运行时抛出错误;因此,不建议将这种更改用于广泛分布的 classes.

将声明为抽象的 class 更改为不再声明为抽象不会破坏与现有实例的兼容性。

超级classes

如果 class 是其自身的超 class,则会在加载时抛出错误。对于广泛分布的 classes,不建议在加载实例时更改 class 层次结构可能导致这种循环。

更改 class 类型的直接超级 class 不会破坏与现有实例的兼容性,前提是 class 的总超级class 集=] 类型不丢失任何属性。

如果对直接 superclass 的更改导致任何 class 分别不再是 superclass,则如果预先存在的实例与修改 class。不建议对广泛分布的 classes 进行此类更改。

Class 属性

如果 属性 被声明为 optional 或被分配 default值。添加既不是可选的也没有默认的新属性将破坏与 class.

的任何预先存在的实例的兼容性

更改 属性 的基数(将数组 [] 更改为非数组,反之亦然)将破坏与 [=114] 任何预先存在的实例的兼容性=].

从 class 中删除 属性 将破坏与任何引用此字段的现有实例的兼容性。

如果 属性 被预先存在的实例使用,则更改 属性 的类型可能会导致错误。

如果 属性 被预先存在的实例使用,则更改 属性 的验证表达式可能会导致错误。

作为关系的属性遵循与其他类型相同的规则。

枚举的演变

在枚举类型中添加或重新排序常量不会破坏与现有实例的兼容性。

如果预先存在的实例试图访问不再存在的枚举常量,则会发生错误。因此,不建议对广泛分布的枚举进行此类更改。

在所有其他方面,枚举的模型演化规则与 classes 的相同。