我正在使用Java中的Google protobuf。我看到可以将protobuf消息序列化为String,byte [],ByteString等:(来源:https : //developers.google.com/protocol- buffers/docs/reference/java/com/google/protobuf / MessageLite)
我不知道什么是ByteString。我从protobuf API文档中获得了以下定义(来源:https : //developers.google.com/protocol- buffers/docs/reference/java/com/google/protobuf/ByteString):“字节的固定序列。子字符串与String一样,通过共享对不可变基础字节的引用来支持。”
我不清楚ByteString与String或byte []有何不同。有人可以解释一下吗?谢谢。
您可以将其ByteString视为不可变的字节数组。就是这样。byte[]您可以在protobuf中使用它。Protobuf不允许您使用Java数组,因为它们是可变的。
ByteString
byte[]
ByteString之所以存在,String是因为它不适合表示任意字节序列。String专用于字符数据。
String
protobuf MessageLite接口提供toByteArray()和toByteString()方法。如果ByteString是不可变的byte [],则由ByteString和byte []表示的消息的字节表示形式是否相同?
有点。如果您致电,toByteArray()您将获得与致电相同的值toByteString().toByteArray()。比较以下两种方法的实现AbstractMessageLite:
toByteArray()
toByteString().toByteArray()
AbstractMessageLite
public ByteString toByteString() { try { final ByteString.CodedBuilder out = ByteString.newCodedBuilder(getSerializedSize()); writeTo(out.getCodedOutput()); return out.build(); } catch (IOException e) { throw new RuntimeException( "Serializing to a ByteString threw an IOException (should " + "never happen).", e); } } public byte[] toByteArray() { try { final byte[] result = new byte[getSerializedSize()]; final CodedOutputStream output = CodedOutputStream.newInstance(result); writeTo(output); output.checkNoSpaceLeft(); return result; } catch (IOException e) { throw new RuntimeException( "Serializing to a byte array threw an IOException " + "(should never happen).", e); } }