Вызов PrepareSerializer без универсальных классов - PullRequest
3 голосов
/ 23 марта 2012

Я использую отражение, чтобы найти все классы в моем проекте, которые наследуются от Packet.Base

К каждому из этих классов применены атрибуты ProtoBuf. * ​​1003 *

Я только что испытал Protobuf.net Exception - Время ожидания при проверке метаданных моего проекта и желание реализовать PrepareSerializer без необходимости проходить через него и добавлять все различные типы классов.

Есть ли простой способ, которым я могу динамически подготовить классы, учитывая, что у меня есть тип из отражения, без необходимости вызывать

ProtoBuf.Serializer.PrepareSerializer(Of Instruction)()
ProtoBuf.Serializer.PrepareSerializer(Of NoOperation)()

или добавлять

Public MustOverride Sub Prepare()

в базовый класс, а затем в каждый класс

Public Overrides Sub Prepare()
    Serializer.PrepareSerializer(Of TimeSynchronise)()
End Sub

Это механизм загрузки, который я использую, довольно простая нагрузка отражения.

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 

1 Ответ

3 голосов
/ 23 марта 2012

Да, это можно назвать без обобщений:

RuntimeTypeModel.Default[type].CompileInPlace();

, где:

  • RuntimeTypeModel.Default - это типовая модель по умолчанию, то есть методы Serializer.*use (v2 поддерживает параллельные независимые модели типов)
  • индексатор [type] выполняет и неявный Add, если он отсутствует, с использованием поведения (атрибутов) по умолчанию - и, следовательно, выполняет большую часть анализа метаданных
  • CompileInPlace() выполняет оптимизацию IL для типа

Также можно попробовать немного увеличить RuntimeTypeModel.Default.MetadataTimeoutMilliseconds.

...