创建一个InputStream
在 C# 中创建的文件,然后调用
Person.parseFrom(InputStream)
如果您更愿意处理该文件中的字节,则此方法还有其他重载。
如果你正在实现一个协议,你需要包含一个标头来识别字节代表的数据类型。从那里你只需选择正确的原型来解析数据。
编辑
这是我创建的一个类,用于将 id 映射到类,反之亦然,以帮助开发带有 protobufs 的协议。如果您不开发网络传输协议,这可能无济于事,但我很确定您是。
我知道你没有要求这个,但也许你会发现它很有用。
将 id 注册到所有 protobuff 生成器,然后检索正确的生成器以在接收时取消序列化字节。在发送之前为每个 protobuf 对象获取正确的 ID。ID 将包含在每个数据包中,以便您知道每个数据包中的数据类型。(这里的数据包是抽象的,这也适用于流协议。)
public class MessageTypeMap {
private final Object lock;
final HashMap<Integer, GeneratedMessageLite> messageParserMap;
final HashMap<Class<?>, Integer> messageClassParserMap;
public MessageTypeMap() {
this.messageParserMap = new HashMap<Integer, GeneratedMessageLite>();
this.messageClassParserMap = new HashMap<Class<?>, Integer>();
this.lock = new Object();
}
public void addMessageType(int typeID, GeneratedMessageLite message) {
synchronized (this.lock) {
this.messageParserMap.put(typeID, message);
this.messageClassParserMap.put(message.getDefaultInstanceForType()
.getClass(), typeID);
}
}
public GeneratedMessageLite getBuilderFor(int id) throws ProtocolException {
synchronized (this.lock) {
if (this.messageParserMap.containsKey(id)) {
GeneratedMessageLite lite = this.messageParserMap.get(id);
return lite;
} else {
throw new ProtocolException("No message builder for ID " + id);
}
}
}
public int getIDFor(Object obj) throws ProtocolException {
synchronized (this.lock) {
if (obj == null) {
throw new NullPointerException(
"Object null while retrieving type id.");
}
Class<?> c = obj.getClass();
if (this.messageClassParserMap.containsKey(c)) {
int typeID = this.messageClassParserMap.get(c);
return typeID;
} else {
throw new ProtocolException("No type id for class "
+ c.getSimpleName());
}
}
}
}
用法:
MessageTypeMap map = new MessageTypeMap();
//register the person type.
map.addMessageType(100, Person.getDefaultInstance());
//use this to unserialize whatever object some bytes are.
GeneratedMessageLite builder = mpa.getBuilderFor(100);
//be sure to include the type id with each transmission of an object.
int id = map.getIDFor(Person.getDefaultInstance());