是否有一种规范的方法来定义Java(以及扩展为Kotlin)中的数据结构,该结构可以按在结构中定义字节的顺序序列化为字节数组或位序列?
类似于C中的结构
编辑:因此,除此之外,我想定义一个数据结构,然后访问它的任何部分的简单而富有表现力的方式。因此,例如,使用伪代码:
DataStructure Message {
Bit newFlag;
Bit genderFlag;
Bit sizeFlag;
Bit activeFlag;
Bit[4] operation;
Byte messageSize;
Byte[] message;
}
那么我们这样做:
Message firstMessage = new Message(1, 0, 1, 0, b'0010', 11, "Hello there");
我们可以说:
ByteArray serialisedMessage = firstMessage.toBytes();
哪个会给我们一个看起来像这样的数组:
[b'10100010', b'00001011', "Hello there" (but in bytes)]
那么我们可以做:
firstMessage.genderFlag = 1;
..然后在对象上重新运行.toBytes。
很明显,在Java中有百万种方法可以做到 这样的功能,据我所知,语法上没有什么简单的-几乎所有事情都涉及编写自定义序列化(而不是按照每个对象的Java)方法进行对象序列化。也许这是规范的方法,但是按照C,Rust和erm,COBOL的要求,简化它会很高兴。
答案 0 :(得分:0)
我不知道您的实际问题的答案。
但是,我将提供关于问题本身性质的一两个想法。 C并不是作为一种高级语言开发的-我听说过的最好的描述是“结构化汇编器”,它的操作符基于 它最初是在其上开发的16位计算机,并不是作为在应用程序中使用的标准而开发的,而是比汇编程序更容易实现的东西,而汇编程序仍然允许程序员有足够的控制权来编写非常有效的代码。用它完成的前两件事是编译器和操作系统,因此运行时效率至关重要(在20世纪70年代初),这时移动和嵌入式开发人员都无法开始欣赏。
在我看来,“按顺序在结构中定义字节”不是思考Java数据的好方法-程序员不知道或不在乎其对象中字段的顺序已存储,或者是否已存储-它不是语言定义的一部分。在我看来,任何库或声称这样做的任何库都必须放入免责声明和/或拥有自己的编译器;尽管我不知道它不能这样做并遵循Java规范,但我也不知道为什么有人会打扰。
所以问自己为什么要这么做。如果您有一个好的答案,请放在这里;我很好奇。