Я иногда получаю следующее исключение при попытке десериализации объекта с использованием protobuf.net.Я удивлен тем, что у меня никогда не бывает более одного потока, десериализующего один и тот же объект одновременно, и источник protobuf.net, похоже, не использует статические объекты для десериализации.Исключение действительно предлагает решение, но я не уверен относительно того, как реализовать, поэтому приветствовал бы пример.
Base Exception Type:
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
at ProtoBuf.Meta.RuntimeTypeModel.TakeLock(Boolean& lockTaken)
at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled)
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
Inner Exception Type:
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
at ProtoBuf.Meta.RuntimeTypeModel.TakeLock(Boolean& lockTaken)
at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled)
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
Stack Trace:
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
at ProtoBuf.Meta.TypeModel.GetKey(Type& type)
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type)
С уважением, Марк
изменить, чтобы добавить: я определяю свои сериализуемые объекты таким образом:
[ProtoContract]
public class Job
{
[ProtoMember(1)]
public long JobId { get; private set; }
}
Мне было бы трудно легко вызывать PrepareSerialiser для каждого из моих сериализуемых объектов, поскольку у меня их много в разных пространствах имен.Однако, если подумать, что произойдет, если protobuf попросят десериализовать два объекта одного типа, типа, который он не видел раньше, в одно и то же время?