Я использую файл 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);
}
Было бы полезно, если бы вы могли предоставить более точную информацию, чем «но я не смог это сделать». Я бы предложил полностью отделить часть HTTP - загрузить файл с диска (например, вы можете сохранить содержимое предыдущего ответа HTTP). Таким образом, вы сможете предоставить минимальный воспроизводимый пример с подробной информацией об ошибках или исключениях времени компиляции, которые вы получаете.
Вы читали учебник от мс? learn.microsoft.com/en-us/aspnet/core/tutorials/grpc/…
@Chetan В приведенном выше коде response.Content возвращает System.Net.Http.HttpConnectionResponseContent. Если код изменить на строку response = client.GetStringAsync(url).GetAwaiter().GetResult();, значением ответа будет Y�����ڏ��� (���260e09991:一条弹幕@��ݗHb1118087686683729920p���0�0 Y������ь (���260e09991:两条弹幕@��ݗHb1118087751233980416p���0�0"?��
Поскольку вы отметили protobuf .net, вам может быть интересно прочитать Работа с файлами .proto с помощью protobuf-net и protobuf-net.BuildTools
@JonSkeet Это хорошая идея, но причина, по которой я этого не сделал, заключается в том, что я не уверен, повредит ли процесс преобразования «ответа https» в «поток» данные protobuf, которые находятся в некоторых не- строка, которую я не понимаю, существует. Моя проблема в том, что я не знаю, какую функцию protobuf объединить с Dm.cs и какой из сотен элементов в Dm.cs?
@SirRufo Спасибо, это не совсем решило проблему, но сделало меня на шаг впереди.
Stream
— это двоичные данные — если вы не конвертируете их в текст, все должно быть в порядке. Но по сути мы не знаем, как выглядит ваш прото-сообщение или какое прото-сообщение вы пытаетесь разобрать. Person.Parser.ParseFrom(input)
должен работать, если вы пытаетесь десериализовать Person
из данных в input
, например...
@JonSkeet Я изменил вопрос, теперь он должен быть намного яснее :-) (на самом деле, если вы откроете WebAPI, который я дал в Chrome, Chrome предоставит вам файл с именем «seg.so», что я и хочу разобрать)
«Я хочу разобрать этот файл в json» — вы имеете в виду, что хотите переформатировать его как JSON? Я отмечаю, что вы впервые упомянули об этом - до этого момента это звучало так, как будто вы просто хотели разобрать файл в представление сообщения в памяти. Работает ли предоставленный вами код с точки зрения синтаксического анализа в представлении в памяти? Ваш вопрос все еще очень неясен.
@JonSkeet Боже мой, приношу свои извинения ... да, я хочу переформатировать «seg.so» в JSON. Этот код не может проанализировать его в памяти, потому что я не знаю, как использовать "Dm.cs" с этим кодом. Например, «Person» в исходном руководстве после компиляции по-прежнему отображается с исходным именем «Person», и в файле есть функция «ParseFrom()», но, похоже, это не так в «Dm. cs", который я получил в результате компиляции. Там много функций с именами, содержащими «От», и я не знаю, как это назвать.
Хорошо, у вас нет сообщения Person, но какое сообщение вы пытаетесь разобрать? Все, что вам нужно сделать, это изменить код на Avatar.Parser.ParseFrom или любой другой тип, о котором вы нам не сказали... (После того, как вы проанализировали, вы можете просто вызвать ToString(), чтобы получить представление JSON, если вы не хотите любое конкретное форматирование.)
Вам нужно знать, какое сообщение вы пытаетесь проанализировать - формат проводки 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), спасибо.
Какой контент вы получаете в response.Content?