NEventStore 3+ 的 Protobuf-net 序列化程序

Posted

技术标签:

【中文标题】NEventStore 3+ 的 Protobuf-net 序列化程序【英文标题】:Protobuf-net serializer for NEventStore 3+ 【发布时间】:2013-04-05 05:35:28 【问题描述】:

谁能给我指点 NEventStore 3.0 的 protobuf-net 序列化程序?

我认为主要是由于事件存储 3 中的序列化将事件主体和标头包装在 EventMessage 中。

我不确定如何正确设置自定义序列化程序。

【问题讨论】:

我对事件存储一无所知,但查看项目页面,它说在问题中包含“cqrs” - 大概是项目所有者主要监控它。如果我可以提供任何 protobuf-net 信息,我会提供帮助 - 但我不熟悉 eventstore API。然而!它看起来主要是一个实现ISerialize 接口的案例,它看起来直接适合protobuf-net 的API。 嗨,Marc,是的,为添加标签而欢呼。我相信乔纳森会发现这个问题,他通常很擅长回答 SO。这确实归结为 protobuf-net 问题,而不是 ES3 问题。 我会去查看源代码并测试其他序列化机制中的[一个],看看它是如何插入的。 @boz 最终大部分都与 ES3 管道有关,但我会在中途遇到你并说“两者兼而有之”:) @boz 在其中使用object 会造成问题。您事先知道这些值是什么吗? protobuf-net 最适合可预测的架构 【参考方案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()

【讨论】:

唯一的技巧是类型信息必须以某种方式嵌入到有效负载中,因为可以将多个消息序列化为一个块。我不确定 protobuf-net 是否支持。 @Jonathan 很好,但对于有限的场景......我很难推荐它。但是:有时通过继承(完全支持)或联合形式可以更巧妙地解决它 嗨@Jonathan,感谢您的反馈。我有一个在开发环境中工作的序列化程序,但我确实需要向 EventMessage 添加 proto 属性。一旦我有一个好的工作版本,我会发布代码。 @boz 它不应该必须添加属性;当这是一个问题时,一切都可以在运行时进行配置 - 请参阅RuntimeTypeModel.Default

以上是关于NEventStore 3+ 的 Protobuf-net 序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3.2 包括与 protobuf 3.1 冲突的 libmir* 和 protobuf 2.6

python 3.7使用protobuf-3.17.3版本

安装protobuf可能遇到的问题

Protobuf从入门到“顺手”

Protobuf从入门到“顺手”

Protobuf从入门到“顺手”