Возможно ли объединить RuntimeTypeModel в protobuf-net? - PullRequest
2 голосов
/ 02 марта 2012

Из того, что я прочитал / увидел, есть 3 способа определения модели для protobuf, с файлами .proto, с оформлением классов и с помощью вызовов времени выполнения для добавления типов и полей. То, что я ищу, это немного больше похоже на FluentNhibernate, где определение модели удалено, чтобы отделить файлы от программы для каждого класса в отдельности, чтобы оставить модель более чистой. В этой мысли я создал класс Buffer<T>, который при создании экземпляра добавляет класс, который он определяет, к модели типов.

public class CustomerBuffer : Buffer<Customer>
{
    public CustomerBuffer()
    {
        Add("ID");
        Add("SyncID");
        Add("AccountNumber");
        Add("Reference");
        Add("Contact");
        Add("Address");
        Add("CreditInformation");
    }
}

используемая модель типов создается в конструкторе Buffer<T>, поэтому она доступна при вызове конструктора производных классов.

Когда все будет добавлено, мне нужно объединить модели, чтобы их можно было скомпилировать.

Пока я пробовал это:

foreach(MetaType MT in model.GetTypes())
{
    InternalModel.Add(MT.Type, false);
}

, который, очевидно, не будет работать, поскольку он не копирует информацию о поле в исходный MetaType.

Поэтому я ищу способ, который позволит мне искать и добавлять все типы, происходящие из Buffer<T> внутри сборки (или нескольких сборок), в модель типа, а затем компилировать ее.

Ответы [ 2 ]

1 голос
/ 20 сентября 2013

Взгляните на Fluent protobuf-net : я думаю, он делает именно то, что вам нужно (например, Fluent NHibernate-like).

1 голос
/ 19 марта 2012

Решено с помощью Singleton для типовой модели. Таким образом, мне не нужно объединять модели типов, поскольку все добавляется в одну модель. Нужно было добавить переопределение в AddSubType, чтобы его можно было вызывать без номера типа. Теперь это прекрасно работает.

Обновление

Это вызывает у меня 2 ошибки, обе из которых основаны на порядке инициализации добавляемых классов.

«Невозможно привести тип x к типу y» Происходит в ProtoWriter и ProtoReader, когда базовый класс инициализируется после подкласса. - Это было решено путем добавления алгоритма сортировки для переноса класса protobufcfg между поиском всех типов для инициализации и их фактической инициализацией.

«Обнаружена возможная рекурсия» Происходит, когда родительский объект, содержащий свойство, представляющее собой список дочерних элементов, инициализируется после дочернего элемента, а дочерний элемент содержит свойство «Родительский».

Update2

Обе эти ошибки связаны с моим неправильным использованием свойства AsReference, которое должно быть динамическим, а также ссылкой на свойство "Parent" дочернего элемента и должно быть удалено из списка.

...