gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:13 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com