You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Protobuf反序列化:如何引入正确类型并解析B站弹幕文件?

解析seg.so文件的C#代码修改方案

核心修改点(基于官方Protobuf C#教程)

  • 第一步:读取seg.so的二进制内容
    seg.so是二进制文件,你需要先把它完整读成字节数组,替换官方教程里的测试数据部分:
// 替换成你的seg.so实际路径
byte[] segData = File.ReadAllBytes("seg.so");
  • 第二步:用生成的Dm.cs解析数据
    找到你proto文件里定义的顶级消息类(比如如果你的proto里写的是message DmMessage {},那类名就是DmMessage),用自动生成的Parser实例解析字节数组:
// 替换成你的Dm.cs里实际的顶级消息类名
var parsedData = DmMessage.Parser.ParseFrom(segData);

如果官方教程是用流读取的写法,也可以改成:

using (var stream = new MemoryStream(segData))
{
    var parsedData = DmMessage.Parser.ParseFrom(stream);
}
  • 第三步:加异常处理(可选但推荐)
    避免因为文件不存在、数据格式不兼容导致崩溃:
try
{
    byte[] segData = File.ReadAllBytes("seg.so");
    var parsedData = DmMessage.Parser.ParseFrom(segData);
    // 这里写解析后的数据处理逻辑
}
catch (FileNotFoundException)
{
    Console.WriteLine("seg.so文件不存在,请检查路径");
}
catch (InvalidProtocolBufferException)
{
    Console.WriteLine("数据格式错误,不是符合dm.proto定义的Protobuf数据");
}
解析结果转JSON:优先用官方工具

必须用官方的Protobuf JSON转换代码,因为第三方工具可能无法正确处理Protobuf的特殊规则(比如枚举值、嵌套消息、重复字段、默认值处理等)。

实现方法

  1. 确保你的项目引用了和protoc-21.12版本匹配的Google.Protobuf和Google.Protobuf.Json NuGet包
  2. 用官方的JsonFormatter转换:
// 基础转换
string json = JsonFormatter.Default.Format(parsedData);
// 保存到文件或输出
File.WriteAllText("dm_result.json", json);

如果需要格式化后的JSON(方便阅读),可以自定义设置:

var formatterSettings = new JsonFormatterSettings
{
    Indentation = "  ", // 用两个空格缩进
    IgnoreDefaultValues = true // 不输出值为默认的字段
};
var formatter = new JsonFormatter(formatterSettings);
string formattedJson = formatter.Format(parsedData);

内容的提问来源于stack exchange,提问作者isnf-uZ4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:11:13