PrepareSerializer call without generic classes
I am using reflection to find all classes in my project that inherit from Packet.Base
Each of these classes has ProtoBuf attributes.
I just experienced Protobuf.net Exception - Timeout while validating the metadata of my project and want to implement PrepareSerializer without having to go through and add all the different class types in there.
Is there an easy way that I can dynamically prepare classes given that I have a type from reflection without the need to call
ProtoBuf.Serializer.PrepareSerializer(Of Instruction)() ProtoBuf.Serializer.PrepareSerializer(Of NoOperation)()
or adding
Public MustOverride Sub Prepare()
base class and then in each class
Public Overrides Sub Prepare() Serializer.PrepareSerializer(Of TimeSynchronise)() End Sub
This is the loading mechanism I'm using, a pretty simple reflection load.
Public Class CompatiblePackets Inherits Dictionary(Of Packet.PacketType, Base) Public Sub New() Dim theAssembly As Assembly = Assembly.GetExecutingAssembly For Each t As Type In theAssembly.GetTypes If t.BaseType Is GetType(Base) Then Dim p As Base = CType(t.Assembly.CreateInstance(t.FullName), Base) Me.Add(p.PacketTypeIndicator, p) End Try End If Next End Sub public sub Prepare ProtoBuf.Serializer.PrepareSerializer(t)() end sub
source to share
Yes, you can call it without generics:
RuntimeTypeModel.Default[type].CompileInPlace();
Where:
-
RuntimeTypeModel.Default
- default type model used by methodsSerializer.*
(v2 supports parallel independent type models) - indexer
[type]
does and implicitAdd
, if not present, using default behavior (attributes) - and therefore most metadata parsing -
CompileInPlace()
the IL is optimized for the type
You can also zoom in a little RuntimeTypeModel.Default.MetadataTimeoutMilliseconds
.
source to share