Serialization 从数据建模的角度看,数据序列化方法(protobuff/thrift)与Yang?

Serialization 从数据建模的角度看,数据序列化方法(protobuff/thrift)与Yang?,serialization,protocol-buffers,thrift,Serialization,Protocol Buffers,Thrift,protobuff和thrift都提供数据定义功能—thrift结构和protobuff消息。除了序列化格式之外,它还使它们成为数据建模语言吗 或者在我们如何使用例如Yang和通过thrift或protobuff模式对数据进行建模方面存在一些根本不同的地方?是的,我想它们确实相当于数据建模语言。写入的模式文件是数据外观的模型,也可能是数据表示的模型 例如,如果一个常用的数据组件表示轴承,那么与其简单地在轴承的任何地方使用int,还可以定义一个特定的轴承类型,然后使用该类型。这样做允许您将轴承所用

protobuff和thrift都提供数据定义功能—thrift结构和protobuff消息。除了序列化格式之外,它还使它们成为数据建模语言吗


或者在我们如何使用例如Yang和通过thrift或protobuff模式对数据进行建模方面存在一些根本不同的地方?

是的,我想它们确实相当于数据建模语言。写入的模式文件是数据外观的模型,也可能是数据表示的模型

例如,如果一个常用的数据组件表示轴承,那么与其简单地在轴承的任何地方使用
int
,还可以定义一个特定的
轴承
类型,然后使用该类型。这样做允许您将
轴承所用的基本类型更改为
浮动
,而不必在其他任何地方进行更改。您可以很高兴地在Thrift、Protobuf等中这样做。被称为
轴承
的类型没有任何空间来假设它可能代表
时间
,并且取决于什么工具(模式编译器)实际执行,可能最终无法在源代码中将
时间
分配给
轴承
。这是非常方便的——开发者必须努力去犯这样的错误

然而,这就揭示了节俭和节俭的某些不足。那个
轴承
类型都很好,但不受约束。如果模式中任何原语(
int
float
)的值都可以限制在0到359之间,那就更好了

其他schame语言也会这样做。JSON模式、XMLSchema(XSD)和ASN.1模式的语言都具有允许模式编写器表达约束的语法。最终的结果是,如果数据受到某种限制,这些模式可以更好地为数据建模

特别是ASN.1约束可能非常复杂,允许多种不同类型的约束(单个值、值范围、依赖于模式中其他地方设置的常量的范围、正则表达式、范围集以及加载、加载等)的逻辑组合。对这种复杂性的工具支持各不相同;花钱买的东西很值钱

代码中的实际结果是显著的。对于Thrift和Protobufs,您最好在模式中添加一条注释,说明数据组件的范围有限,并希望开发人员阅读注释并遵守注释。这在一个1人的团队中更为可能,而在一个有很多开发人员的团队中则不太可能。。。如果忽略,开发人员完全有可能构建一条包含375的
轴承的消息(在期望的约束之外),并且没有任何东西可以阻止序列化和通信,除非开发人员专门编写代码来防止这种情况

而对于ASN.1,模式的语法中有约束,用于将该模式合并到项目中的工具将自动生成代码,以检查序列化或反序列化的数据是否符合要求。结果:不依赖于开发人员读取模式中的注释。这同样适用于JSON和XSD,尽管根据我的经验,很多XSD工具在完全实现XSD模式中表示的接口时都是垃圾(例如,MS的XSD.exe完全忽略约束)。我认为JSON验证器更好

总之,yes Thrift和Protobufs可以用于数据建模,但它们的模式语言不一定允许定义“完整”的数据模型。其他模式语言更好,允许也为数据定义值/大小约束,并在工具中提供不同级别的支持

它们都不允许表达数据的时间/行为/关系性质(即每秒发送一次消息),但如果要尝试使用支持该特性的模式语言,我怀疑它会变成图灵完整的。在这种情况下,我们已经有很多现有的编程语言来支持它