Сериализатор Protobuf-net для NEventStore 3+

Может ли кто-нибудь указать мне сериализатор protobuf-net для NEventStore 3.0?

У меня проблемы, я думаю, в основном из-за сериализации в хранилище событий 3, заключающей тело события и заголовки в EventMessage.

Я не уверен, как правильно настроить пользовательский сериализатор.


person boz    schedule 05.04.2013    source источник
comment
Я ничего не знаю о магазине событий, но, глядя на страницу проекта, он говорит, что нужно включать cqrs в вопросы - предположительно, владелец (владельцы) проекта следит за этим в первую очередь. Если я могу помочь с какой-либо информацией о protobuf-net, я это сделаю, но я не знаком с API магазина событий. Однако! в первую очередь это выглядит как реализация ISerialize< /a> интерфейс, который, похоже, напрямую подходит для API protobuf-net.   -  person Marc Gravell    schedule 05.04.2013
comment
Привет, Марк, да, спасибо за добавление тега. Я уверен, что Джонатон заметит вопрос, обычно он довольно хорошо отвечает на SO. Это действительно сводится к вопросу protobuf-net, а не к вопросу ES3.   -  person boz    schedule 05.04.2013
comment
Я бы посмотрел исходный код и протестировал [один из] других механизмов сериализации и посмотрел, как это работает.   -  person Ruben Bartelink    schedule 05.04.2013
comment
@boz в конечном итоге большая часть этого относится к сантехнике ES3, но я встречу вас на полпути и скажу, что это и то, и другое :)   -  person Marc Gravell    schedule 05.04.2013
comment
@boz, а как выглядит EventMessage? Обратите внимание, что вы можете настроить protobuf-net во время выполнения типа вне вашего контроля (атрибуты проще, но любой подход работает)   -  person Marc Gravell    schedule 06.04.2013
comment
@marc — это EventMessage из хранилища событий. github.com/joliver/EventStore/blob/master/ src/proj/EventStore/. У меня есть рабочая версия, но мне нужно атрибутировать объект. Я бы предпочел использовать ваш подход к настройке во время выполнения.   -  person boz    schedule 06.04.2013
comment
@boz использование object делает это проблематичным. Знаете ли вы заранее, каковы эти значения? protobuf-net лучше всего работает с предсказуемой схемой   -  person Marc Gravell    schedule 06.04.2013


Ответы (1)


Это полностью непроверенная догадка, основанная на очень беглом взгляде на github, но похоже, что вы хотите использовать API подключения для указания пользовательского сериализатора, например:

var store = Wireup.Init()
    .UsingSqlPersistence("Name Of EventStore ConnectionString In Config File")
        .InitializeStorageEngine()
        .UsingCustomSerialization(mySerializer)
    ... etc

где mySerializer — экземпляр типа, реализующего интерфейс ISerialize. Похоже, это должно работать:

class ProtobufSerializer : EventStore.Serialization.ISerialize
{
    public void Serialize<T>(Stream output, T graph)
    {
        ProtoBuf.Serializer.Serialize<T>(output, graph);
    }

    public T Deserialize<T>(Stream input)
    {
        return ProtoBuf.Serializer.Deserialize<T>(input);
    }
}

(поэтому очевидно, что mySerializer здесь будет new ProtobufSerializer())

person Marc Gravell    schedule 05.04.2013
comment
Единственная хитрость заключается в том, что информация о типе каким-то образом должна быть встроена в полезную нагрузку, потому что несколько сообщений могут быть сериализованы как блок. Я не уверен, поддерживает ли protobuf-net это. - person Jonathan Oliver; 10.04.2013
comment
@ Джонатан, ну, вроде как, но для ограниченных сценариев ... Я изо всех сил пытаюсь это порекомендовать. Однако: иногда есть способы обойти это более аккуратно с наследованием (которое полностью поддерживается) или формой объединения - person Marc Gravell; 10.04.2013
comment
Привет @Jonathan, спасибо за отзыв. У меня есть сериализатор, работающий в среде разработки, но мне нужно было добавить атрибуты proto в EventMessage. Как только у меня будет хорошая рабочая версия, я выложу код. - person boz; 11.04.2013
comment
@boz никогда не должно быть необходимо добавлять атрибуты; все можно настроить во время выполнения, если это проблема - см. RuntimeTypeModel.Default. - person Marc Gravell; 11.04.2013