InputStream
C# で作成したファイルに を作成し、呼び出します
Person.parseFrom(InputStream)
そのファイルのバイトを処理したい場合は、このメソッドに他のオーバーロードがあります。
プロトコルを実装している場合は、バイトが表すデータの種類を識別するためにヘッダーを含める必要があります。そこから、データを解析する正しい proto を選択するだけです。
編集
これは、protobufs を使用したプロトコルの開発を支援するために、ID をクラスに、またはその逆にマッピングするために作成したクラスです。ネットワーク伝送用のプロトコルを開発していない場合、これは役に立たないかもしれませんが、そうであると確信しています。
あなたがこれを求めていないことは知っていますが、おそらく役に立つでしょう。
すべてのプロトバフ ジェネレーターに ID を登録し、受信時にバイトをシリアル化解除するための正しいジェネレーターを取得します。送信する前に、各 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());