C# Protobuf net显示为框值类型。真的是这样吗?

C# Protobuf net显示为框值类型。真的是这样吗?,c#,.net,protobuf-net,C#,.net,Protobuf Net,这是今天在分析应用程序时出现的。我环顾四周,没发现什么。虽然下面的问题与我的问题无关,但它确实有一个很好的调用堆栈 在这些生产线中,有一条正好出现在我们的产品堆中,成本相当高: at ProtoBuf.ProtoReader.ReadTypedObject (object,int,ProtoBuf.ProtoReader,System.Type) <0x00056> 在ProtoBuf.ProtoReader.ReadTypedObject(object,int,ProtoBuf

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

在这些生产线中,有一条正好出现在我们的产品堆中,成本相当高:

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

这是否意味着所有的值类型,特别是结构,总是被装箱;看起来,如果您没有完全编译模型,那么是:
SubItemSerializer
当前使用了“box,callback to
ReadObject
”策略。我认为这是一个bug,所以谢谢你发现它!在完全编译时,此问题不适用,因为它使用了不同的策略,因此现在您可能只需准备一个具有您感兴趣的类型的模型即可解决此问题,例如:

static readonly TypeModel serializer;

static SomeType()
{
    var model = RuntimeTypeModel.Create();
    model.Add(typeof(SomeRootType), true);    
    model.Add(typeof(SomeOtherRootType), true);
    // ...
    serializer = model.Compile();
}
(然后使用
序列化程序
,而不是静态
序列化程序
实用程序来序列化和反序列化)

我将研究是否可以在看到内联结构时将
子项序列化程序
更改为内联结构



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

Marc,谢谢你的帮助!非常感谢。我会尝试解决方法。我将期待下一个版本。如果你不介意,请在准备好后在这里添加评论。@schultz会的;首先我只需要让peverify高兴。当我的CIL没有完全验证时,我感到非常不安