c# - Protobuf-net 似乎是对值类型进行包装。事实是这样吗?

标签 c# .net protobuf-net

这是今天在分析应用程序时出现的。我环顾四周,还没有发现太多。虽然以下问题与我的问题无关,但它确实有一个很好的调用堆栈。

protobuf-net deserialization System.IO.EndOfStreamException under mono

在这些行中,恰好有一行突然出现在我们的堆栈中并且具有相当高的成本:

at ProtoBuf.ProtoReader.ReadTypedObject (object,int,ProtoBuf.ProtoReader,System.Type) <0x00056>

这是否意味着所有值类型,特别是结构,总是装箱的?

最佳答案

嗯,有趣;看起来如果您没有完全编译模型,那么是的:SubItemSerializer 目前采用“框,回调到ReadObject”策略.我认为这是一个错误,所以感谢您发现它!这个问题在完全编译时不适用,因为它使用不同的策略,所以现在你可以通过准备一个你感兴趣的类型的模型来简单地解决它 - 例如:

static readonly TypeModel serializer;

static SomeType()
{
    var model = RuntimeTypeModel.Create();
    model.Add(typeof(SomeRootType), true);    
    model.Add(typeof(SomeOtherRootType), true);
    // ...
    serializer = model.Compile();
}

(然后使用serializer,而不是静态Serializer 实用程序,来序列化和反序列化)

我将研究是否可以在看到结构时将 SubItemSerializer 更改为内联结构。


更新:我基本上有内联工作,但它突出了堆栈和分支的一些问题,这些问题在按方法边界分隔时是合法的,但在分支跨越堆栈线时不合法- 在我提交之前我也在修复它(基本上,它涉及在一些关键位置引入一些本地人,而不是将东西放在堆栈上)。

关于c# - Protobuf-net 似乎是对值类型进行包装。事实是这样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005095/

相关文章:

asp.net-mvc - 用于 EnyimMemcached 问题的 protobuf-net 转码器

c# - NHibernate 3 Linq 查询缓存

c# - 命名空间 'SharePoint' 在命名空间 'Microsoft' 中不存在

c# - ComboBox 的 SelectedItem 在实际值之前意外设置为 null

c# - 是否可以执行存储在变量中的机器代码?

c# - 是否可以使用 Linq to SQL 运行任意查询? (C#)

c# - 将原始序列化值添加到 Protocol Buffer (protobuf-net、protobuf-csharp)中的重复字段

c# - 如何使用 protobuf 将 ServiceStack 服务与非 ServiceStack 客户端集成?

c# - 如何使用仅替换 www 的第一次出现

c# - .在 NET Core 3.1 依赖注入(inject)中使用工厂模式