Десериализовать постоянное сообщение akka.net, используя C#
Я использовал постоянство akka.net для хранения некоторых типов сообщений в базе данных сервера sql. И по этому бизнес-сценарию это работает. В другом случае я просто хотел десериализовать сообщение с помощью C# .net и увидеть свойство сообщения без akka.net. как это возможно?
1 ответ
В Akka.Persistence с настроенным журналом SQL все ваши данные о событиях попадают в сериализованный двоичный файл в Payload
столбец таблицы, используемой для поиска событий (в SQLServer по умолчанию это dbo.EventJournal
). В будущем будет возможность изменить этот формат с двоичного на тип данных JSON, если выбранная вами база данных будет поддерживать этот формат.
В зависимости от того, какой сериализатор вы используете, вы можете просто получить исходное событие, просто десериализовав содержимое столбца Payload. Хотя вам никогда не следует использовать сериализатор по умолчанию, если вы уже использовали его, вам нужно знать, что на момент выпуска версии 1.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);
}
Другие поля таблицы журнала событий содержат метаданные, описывающие такие вещи, как общий порядок событий (используемый функцией тегирования) и, в частности, идентификатор сохраняемости субъекта и порядковый номер конкретного события (монотонно растущий в контексте одного субъекта).).