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 序列化程序的主要内容,如果未能解决你的问题,请参考以下文章