0

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

4

1 回答 1

0

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

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

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 和特定事件的序列号(在单个演员的上下文中单调增长) )。

于 2017-04-27T10:56:43.213 回答