使用C#反序列化akka.net持久性消息

时间:2017-04-25 06:59:47

标签: c# akka.net akka.net-persistence

我使用akka.net持久性在sql server数据库中存储一些消息类型。在那个业务场景中,它可行。在其他情况下,我只想使用C#.net反序列化消息,并查看不带akka.net的消息属性。怎么可能呢?

1 个答案:

答案 0 :(得分:0)

在Akka.Persistence中使用已配置的SQL日志,所有事件数据都在用于事件源的表的Payload列中作为序列化二进制文件登陆(在SQLServer上默认为dbo.EventJournal)。如果您选择的数据库支持该格式,将来可以将此格式从二进制更改为JSON数据类型。

根据您使用的序列化程序,您只需通过反序列化Payload列的内容即可检索原始事件。虽然你永远不应该使用默认的序列化程序,但如果你已经这样做了,你需要知道在v1.2那时它是JSON.NET。您可以使用JsonConvert对保留对象引用(here)进行反序列化:

byte[] payload = ...; // get bytes from Payload column
var settings = new JsonSerializerSettings {PreserveReferencesHandling = PreserveReferencesHandling.Objects};
using (var stream = new MemoryStream(payload))
using (var reader = new StreamReader(stream))
{
    var domainEvent =  JsonConvert.DeserializeObject(reader.ReadToEnd(), settings);
}

事件日志表的其他字段携带元数据,描述事件的总顺序(由标记功能使用),最值得注意的是,演员的持久性ID和特定事件的序列号(在上下文中单调增长)一个演员)。