protobuf-net线程安全吗?

时间:2013-06-13 20:24:21

标签: c# protobuf-net

我注意到当我在多线程环境中使用protobuf-net时,它会间歇性地失败并出现以下错误:

System.TimeoutException: Timeout while inspecting metadata; this may indicate a deadlock. 
This can often be avoided by preparing necessary serializers during application initialization, rather than allowing multiple threads to perform the initial metadata inspection

但是,如果我在第一次序列化某个特定类型时锁定了对protobuf-net序列化程序的访问权限,那么它可以正常工作。

protobuf-net意味着线程安全,还是只是一个bug?

1 个答案:

答案 0 :(得分:13)

Protobuf的元数据检查不是线程安全的。这个错误是“罕见的”,但在并行完成的大型序列化中会发生很多。我在我的项目中遇到了这个确切的错误,我将序列化了大约7000万个对象。您可以通过生成序列化的元数据AHEAD来修复它:

Serializer.PrepareSerializer<YourCustomType1>();
Serializer.PrepareSerializer<YourCustomType2>();

在序列化之前的某个地方执行该代码,可能是静态构造函数,用于序列化的每个自定义类型。

您还可以尝试增加Protobuf的元数据检查超时以尝试帮助您,但是如果Protobuf代码中存在真正的死锁,这实际上只会延迟您的异常:

// Initialize Protobuf Serializer for 5 minutes of wait in the case of long-waiting locks
RuntimeTypeModel.Default.MetadataTimeoutMilliseconds = 300000;