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

C# 使用C反序列化akka.net持久性消息#,c#,akka.net,akka.net-persistence,C#,Akka.net,Akka.net Persistence,我使用akka.net持久性在sql server数据库中存储了一些消息类型。在这个商业场景中,它是有效的。在另一种情况下,我只想使用C#.net反序列化消息,并在没有akka.net的情况下查看消息属性。怎么可能呢 在配置了SQL日志的Akka.Persistence中,您的所有事件数据都作为序列化二进制文件降落在用于事件源的表的有效负载列中(在SQLServer上默认为dbo.EventJournal)。将来,如果您选择的数据库支持这种格式,就有可能将这种格式从二进制更改为JSON数据类型

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

在配置了SQL日志的Akka.Persistence中,您的所有事件数据都作为序列化二进制文件降落在用于事件源的表的
有效负载
列中(在SQLServer上默认为
dbo.EventJournal
)。将来,如果您选择的数据库支持这种格式,就有可能将这种格式从二进制更改为JSON数据类型

根据您使用的序列化程序,您可以通过简单地反序列化负载列的内容来检索原始事件。虽然您永远不应该使用默认序列化程序,但如果您已经使用了,那么您需要知道,在v1.2版本中,它是JSON.NET。您只需使用
jsonvert
对其进行反序列化,并保留对象引用():

byte[]有效负载=…;//从有效负载列获取字节
var settings=newjsonserializersettings{PreserveReferencesHandling=PreserveReferencesHandling.Objects};
使用(var流=新内存流(有效负载))
使用(变量读取器=新的流读取器(流))
{
var domainEvent=JsonConvert.DeserializeObject(reader.ReadToEnd(),设置);
}

事件日志表的其他字段包含元数据,这些元数据描述事件的总顺序(由标记功能使用),最显著的是参与者的持久性id和特定事件的序列号(在单个参与者的上下文中单调增长).

您使用哪个序列化程序将事件序列化到SQL Server?我使用了akka附带的默认序列化。net在反序列化的消息中,有一个信息告诉消息是否已传递?消息和事件是两个不同的概念。持久性关注事件和状态快照(如EventSourcing术语)。关于消息传递的信息是非常无用的,因为它不会告诉您消息是否被实际处理,并且在大多数(所有?)情况下,我们感兴趣的是处理请求,而不仅仅是接收请求。