gpt4 book ai didi

java - 使用 Protocol Buffer 序列化/反序列化独立整数

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:23 25 4
gpt4 key购买 nike

到目前为止,我一直在使用 Protocol Buffers 通过代码生成的类来序列化和反序列化对象。

现在我正在尝试序列化和反序列化单个 64 位整数。问题是,我在 Java 和 C# 中得到了不同的结果。

这是我在 Java 中的做法....

private static byte[] convertLongToByteArray(long value) throws IOException {
int size = CodedOutputStream.computeInt64SizeNoTag(value);
byte[] buffer = new byte[size];
CodedOutputStream codedOutputStream = CodedOutputStream.newInstance(buffer);
codedOutputStream.writeInt64NoTag(value);
codedOutputStream.flush();
codedOutputStream.checkNoSpaceLeft();
return buffer;
}

下面是我在 C# 中使用 protobuf.net 执行此操作的方式:

public void SerializeLongValue()
{
long n = 9876;
byte[] memoryBuffer = null;
using (MemoryStream destination = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(destination, n);
destination.Flush();
memoryBuffer = destination.ToArray();
}

using (MemoryStream source = new MemoryStream(memoryBuffer))
{
long result = ProtoBuf.Serializer.Deserialize<long>(source);
Assert.AreEqual(n, result);
}
}

Java 代码将数字 9876 转换为 [0x94, 0x4D]

C# 代码将数字 9876 转换为 [0x08, 0x94, 0x4D]

我该怎么做才能使 com.google.protobufprotobuf.net 产生相同的输出?

最佳答案

protobuf.net 方法 ProtoBuf.Serializer.Serialize 强制将字段 header (字段编号 = 1)放入流中。这是执行序列化的唯一方法;此方法调用许多不公开可用的内部方法。

我使用的解决方案是更改 Java 代码以同时包含字段标题。

这是我的新 Java 代码。

private static byte[] convertLongToByteArray(long value) throws IOException {
int size = CodedOutputStream.computeTagSize(1) + CodedOutputStream.computeInt64SizeNoTag(value);
byte[] buffer = new byte[size];
CodedOutputStream codedOutputStream = CodedOutputStream.newInstance(buffer);
codedOutputStream.writeInt64(1, value);
codedOutputStream.flush();
codedOutputStream.checkNoSpaceLeft();
return buffer;
}

public static long convertByteArrayToLong(byte[] byteArray) throws IOException {
CodedInputStream codedInputStream = CodedInputStream.newInstance(byteArray);
codedInputStream.readTag();
return codedInputStream.readInt64();
}

我所做的更改是:

  • 计算所需缓冲区大小时,包括标签大小
  • 调用 CodedOutputStream.WriteInt64 而不是 CodedOutputStream.WriteInt64NoTag
  • 回读时,先调用CodedOutputStream.ReadTag再调用CodedOutputStream.ReadInt64

关于java - 使用 Protocol Buffer 序列化/反序列化独立整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35260663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com