@kanonak-protocol /编解码器
通用的、与本体无关的 编解码器运行时 参考Kanonak’s
生成类型sdk。它将类型化对象转换为Kanonak内容地址和
给定每个包的规范化json连接形式 CodecSchema ,一个
生成SDK嵌入。
它是编解码器运行时的TypeScript端口。c# /Rust/Go/Java/Python端口
参考他们的 kanonak-canonical 库用于相同的标准哈希表项;
打印稿引用 @kanonak-protocol/canonical -它唯一的依赖。
它是做什么的
packageContentHash(nodes, schema, pkg)→sha256:…——永久的 这些节点形成的包的内容地址。建立语言中立 规范输入模型(kanonak.org/canonical-form),并将其散列@kanonak-protocol/canonical. Byte-identical来kanonak hash的 等价的撰写.kan.yml,包括合成的rdf:type三元组 和包装主体。packageCanonicalForm(nodes, schema, pkg)-规范形式本身 ({subjects:[…]}JSON),用于检查/调试。serialize(node, schema)/deserialize(json, schema)-规范化的json 线的形式。类型模型之外的开放世界断言可以无损地往返 通过$extra(顶级线字段,收集下$extra在打字上 节点,[JsonExtensionData]语义)。从3.0.0开始,每个整数和小数 value以JSON形式(kanonak-protocol 4.11.0’s)传播numbers-in-json, 运行时#54),通过列表和嵌入值。deserialize给出一个宽 整数(integer四种符号限制形式;long,unsignedLong), 一个bigint,一个decimal作为其规范数字的字符串,和int和 窄得像number;serialize将宽整数和小数写入为 它们的规范数字的字符串,以及作为数字的窄整数。一个 模式不包含其类的内嵌值按给定方式携带。deserialize判断给定的值:JSON.parse已经读过了 数字如1.0000000000000000001作为1,所以来电者必须拒绝 判断数字的来源,作为一个复兴者context.source给出它(节点22)。超过±(2^53−1)的JSON数字用于宽整数,数字用于十进制,字符串用于窄整数,或超出其数据类型范围的值被拒绝,结束[json-number-form],因为codec-vectors-json-numbers.json每个端口的引脚。
散列也拒绝模式没有声明的语句 $extra 类没有建模的入口或键 [hash-undeclared-statement]:编解码器保存一个包的模式,不能键入另一个包的谓词,因此这样的节点与SDK在图上进行散列。序列化和反序列化仍然携带它(codec 2.0.0, runtime#37)。
设计独立
载体来自模式的数据类型uri和已解析的基础uri
(type/label 谓词, Package 类)被生成器嵌入
所以哈希需要 没有运行时本体解析 而且不能访问注册表。一个
生成的SDK加上这个库(和它的一个库) @kanonak-protocol/canonical
依赖关系)足以在无服务器/边缘环境中实现内容地址类型的对象
运行时。
形状
import { packageContentHash, serialize, deserialize } from '@kanonak-protocol/codec';
import type { CodecSchema, CodecNode, PackageContext } from '@kanonak-protocol/codec';
// `Schema` is the constant a generated SDK embeds for its own classes.
const hash = packageContentHash(nodes, Schema, {
publisher: 'example.com', packageName: 'my-data', version: '1.0.0',
});
canonicalFormVersion: "1" -内容地址规则是冻结和发展的
只能创建一个新版本(通过底层的规范形式规范)。
嵌入值(0.2.0)
对象属性的值是a 参考 ({ $ref: uri })或
嵌入式节点没有数字的地图 $id,可选 $name (撰写
Dict-key - hash-relevant),可选的 $type,以及模式映射字段。
一个显式的 $type 在嵌入的(哈希相关的)
即使它等于范围派生类型);如果没有,字段将通过映射
包含属性的 range 并且不会发出类型语句。嵌入式
集合是有序列表——列表的顺序是语义的和散列的。一个空
List不提供任何语句(在规范中,缺席和空是相同的)
层)。封闭的 vectors/codec-vectors-embedded.json.
一个参考值指向A 命名资源: publisher/package[@version]/name.
一、 $ref 包含URI片段(#…)被规范化所拒绝,
serialize 和 deserialize 在任何深度都是一样的,以错误结尾
[fragment-reference]. 片段处理用于导航的嵌入式资源;
它们不是参考图的一部分。封闭的
vectors/codec-vectors-references.json.
读取早期兼容版本(0.6.1)
节点的类型是与其生成器导入解析的类的版本一致的
出现。生成的编解码器 兼容的 同一软件包的版本
仍然是这样读的: deserialize 首先获取精确版本化的类,然后是
的最高级架构版本中的同一个类 isReadableBy (从
@kanonak-protocol/canonical)说可以读书面的。节点保持
这个 $type 上面写着。
typeMatches(node, classUri, schema)-生成的类型保护要求的内容。 每个节点的类型($types,否则$type)经历了同样的事情 兼容查找和匹配时,类classUri或者它在 它的ancestors,可选的传递超类列表aCodecClass可以 携带。类通过无版本标识进行比较。enumMember(schema, ref)-枚举成员a{"$ref"}的名字, 首先是完全相同的,然后是兼容的后续版本中的相同成员。- 哈希保持精确版本。 内容散列覆盖了生产者的
谓词和类型uri,包括版本,所以模式在较新的版本
无法复制。散列缺少确切类的节点会失败
[hash-needs-exact-version]当只有一个兼容类存在时。
错误以括号中的类型结束: [unknown-type], [newer-version] (数据
可能会使用这个模式缺少的术语), [other-major], [other-minor-line] (下图
1.0.0(次要行是不兼容的行)和 [hash-needs-exact-version].
封闭的 vectors/codec-vectors-compat.json.