到目前为止,我一直在使用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;
}
以下是我如何使用protobuf.net在C#中完成这个任务的代码:
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.protobuf
和protobuf.net
的输出完全相同?
ProtoWriter
的类,它的工作方式有点类似于CodedOutputStream
;但是,我怀疑它在写入最终可能是不完整/无效文档时可能会出现问题。在某种程度上,它看起来像是你想要的一种类似于ProtoReader.DirectReadVarintInt32
的东西,但是a:写(而不是读),b:64位。目前还不存在一个在ProtoWriter
实例之外的DirectWriteVarintInt64
方法。 - Marc GravellProtoWriter.WriteInt64
会抛出异常,而且只有通过调用ProtoWriter.WriteFieldHeader
才能设置线路类型。 - Andrew Shepherd