Как при десериализации Protobuf в C# ввести правильный тип protobuf?

Я использую файл proto dm.proto в этом проекте для ввода официального компилятора protoc-21.12-win64 для генерации файла парсинга Dm.cs

Данные, которые мне нужно разобрать, это файл: seg.so

Код отсюда

Как изменить официальный код для разбора этого файла? Я хочу разобрать этот файл в json, должен ли я использовать официальный код?

Person john;
using (var input = File.OpenRead("john.dat"))
{
    john = Person.Parser.ParseFrom(input);
}

Какой контент вы получаете в response.Content?

Chetan 13.02.2023 11:13

Было бы полезно, если бы вы могли предоставить более точную информацию, чем «но я не смог это сделать». Я бы предложил полностью отделить часть HTTP - загрузить файл с диска (например, вы можете сохранить содержимое предыдущего ответа HTTP). Таким образом, вы сможете предоставить минимальный воспроизводимый пример с подробной информацией об ошибках или исключениях времени компиляции, которые вы получаете.

Jon Skeet 13.02.2023 11:20

Вы читали учебник от мс? learn.microsoft.com/en-us/aspnet/core/tutorials/grpc/…

Sir Rufo 13.02.2023 11:29

@Chetan В приведенном выше коде response.Content возвращает System.Net.Http.HttpConnectionResponseContent. Если код изменить на строку response = client.GetStringAsync(url).GetAwaiter().GetResult();, значением ответа будет Y�����ڏ��� (���260e09991:一条弹幕@��ݗHb1118087686683729920p���0�0 Y�����܏�ь (���260e09991:两条弹幕@��ݗHb1118087751233980416p���0�0"?��

isnf-uZ4 13.02.2023 11:33

Поскольку вы отметили protobuf .net, вам может быть интересно прочитать Работа с файлами .proto с помощью protobuf-net и protobuf-net.BuildTools

JonasH 13.02.2023 11:35

@JonSkeet Это хорошая идея, но причина, по которой я этого не сделал, заключается в том, что я не уверен, повредит ли процесс преобразования «ответа https» в «поток» данные protobuf, которые находятся в некоторых не- строка, которую я не понимаю, существует. Моя проблема в том, что я не знаю, какую функцию protobuf объединить с Dm.cs и какой из сотен элементов в Dm.cs?

isnf-uZ4 16.02.2023 01:12

@SirRufo Спасибо, это не совсем решило проблему, но сделало меня на шаг впереди.

isnf-uZ4 16.02.2023 03:08
Stream — это двоичные данные — если вы не конвертируете их в текст, все должно быть в порядке. Но по сути мы не знаем, как выглядит ваш прото-сообщение или какое прото-сообщение вы пытаетесь разобрать. Person.Parser.ParseFrom(input) должен работать, если вы пытаетесь десериализовать Person из данных в input, например...
Jon Skeet 16.02.2023 09:14

@JonSkeet Я изменил вопрос, теперь он должен быть намного яснее :-) (на самом деле, если вы откроете WebAPI, который я дал в Chrome, Chrome предоставит вам файл с именем «seg.so», что я и хочу разобрать)

isnf-uZ4 16.02.2023 10:00

«Я хочу разобрать этот файл в json» — вы имеете в виду, что хотите переформатировать его как JSON? Я отмечаю, что вы впервые упомянули об этом - до этого момента это звучало так, как будто вы просто хотели разобрать файл в представление сообщения в памяти. Работает ли предоставленный вами код с точки зрения синтаксического анализа в представлении в памяти? Ваш вопрос все еще очень неясен.

Jon Skeet 16.02.2023 10:47

@JonSkeet Боже мой, приношу свои извинения ... да, я хочу переформатировать «seg.so» в JSON. Этот код не может проанализировать его в памяти, потому что я не знаю, как использовать "Dm.cs" с этим кодом. Например, «Person» в исходном руководстве после компиляции по-прежнему отображается с исходным именем «Person», и в файле есть функция «ParseFrom()», но, похоже, это не так в «Dm. cs", который я получил в результате компиляции. Там много функций с именами, содержащими «От», и я не знаю, как это назвать.

isnf-uZ4 16.02.2023 11:37

Хорошо, у вас нет сообщения Person, но какое сообщение вы пытаетесь разобрать? Все, что вам нужно сделать, это изменить код на Avatar.Parser.ParseFrom или любой другой тип, о котором вы нам не сказали... (После того, как вы проанализировали, вы можете просто вызвать ToString(), чтобы получить представление JSON, если вы не хотите любое конкретное форматирование.)

Jon Skeet 16.02.2023 11:41
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
0
12
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно знать, какое сообщение вы пытаетесь проанализировать - формат проводки protobuf не включает в себя какие-либо указания схемы. Но как только вы это узнаете, все должно быть просто:

// Change this to whichever message type you expect the data to be.
// Your proto file contains lots of messages... I'm guessing at the one
// you wanted, based on the service and the filename.
DmSegOttReply reply = DmSegOttReply.Parser.ParseFrom(data);

// If you need different formatting options you can use JsonFormatter,
// but normally ToString is all you need.
string json = avatar.ToString();

Вы убили мой вопрос! (дополнительный смысл) Я понял структуру этого файла из кода, который вы дали, и, наконец, я вставил DmSegMobileReply в код, который вы дали, и получил идеальный результат синтаксического анализа json. (Выбор DmSegMobileReply исходит из того места, где настроен dm.proto), спасибо.

isnf-uZ4 20.02.2023 10:53

Другие вопросы по теме