C# Protobuf: 'Сообщение протокола содержало тег с недопустимым типом провода.' - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь прочитать некоторые данные protobuf из коллеги - он создал их в C ++ и установил кодировку в unicode, а режим передачи для protobuf является двоичным.

В python это работает отлично:

with open('test.out', 'rb') as f:
    dfile = protoclass_pb2.DataFile()
    dfile.ParseFromString(f.read())
    print(dfile.MetaData.author)

точно так же, как талисман.

В C# однако я пытаюсь:

string filepath = "test.out"
FileStream fst = new FileStream(filepath, 
DataFile data = DataFile.Parser.ParseDelimitedFrom(fst);
fst.Close();

и получаю исключение:

Google.Protobuf.InvalidProtocolBufferException: 'Protocol message contained a tag with an invalid wire type.'

Мне надоело как-то устанавливать кодировку для потока, но, насколько я могу судить, я могу установить только кодировку StreamReader, но не Stream.

Простое чтение содержимого файла в массив приводит к одинаковые на обоих языках.

Как я могу прочитать данные в C#?

1 Ответ

0 голосов
/ 16 марта 2020

Обнаружил проблему: коллега сериализовал сообщение с помощью SerializeToOstream, и я попытался прочитать с помощью ParseDelimitedFrom.

Легко исправить, используя SerializeDelimitedToOstream для сериализации или ParseFrom для чтения.

...