message Guid {
optional fixed64 lo = 1; // the first 8 bytes of the guid
optional fixed64 hi = 2; // the second 8 bytes of the guid
}
当我将proto编译成Java类并创建此Java UUID实例时:
UUID uid = UUID.fromString("2ac9f438-f555-40b0-8880-02226b81285c");
如果我将uid.getMostSignificantBits()或uid.getLeastSignificantBits()作为Guid.setHi()(或Guid.setLo())的参数,则无论我选择哪种组合都没有关系。
无论我选择哪种组合,当C#反序列化包含Java生成的guid的类型并测试guid的值时,都会出现似乎是字节顺序问题的情况:
expected:<2ac9f438-f555-40b0-8880-02226b81285c>
but was:<f55540b0-f438-2ac9-5c28-816b22028088>
…或者:
expected:<2ac9f438-f555-40b0-8880-02226b81285c>
but was:<6b81285c-0222-8880-b040-55f538f4c92a>
这个问题有简单的解决方法吗?
需要指出我对protobuf不是很熟悉,所以在这方面可能有些模糊。
编辑:
值得一提的是,在将uid.getLeast/MostSignificantBits()中的一个或两个结果反转字节顺序之后再将结果提供给Guid.setLo/Hi,并交换这些顺序,我也尝试过,但可惜没有成功...
第二次编辑: 难怪仅仅对两个长整型进行简单的字节序交换不起作用(摘自这里):
开始四字节组和下一个两个双字节组的顺序被颠倒了,而最后两个双字节组和结束六字节组的顺序是相同的。
请参考我在此问题上发布的答案。如果两种语言都要在应用程序代码中使用本机二进制guid/uuid类型,我不确定是否还有其他方法。除了将guid作为字符串发送,还有其他建议吗?