private SnapshotEntry ToSnapshotEntry(SnapshotMetadata metadata, object snapshot) { var snapshotRep = new Akka.Persistence.Serialization.Snapshot(snapshot); var serializer = _serialization.FindSerializerFor(snapshotRep); var binary = serializer.ToBinary(snapshotRep); var manifest = ""; if (serializer is SerializerWithStringManifest stringManifest) { manifest = stringManifest.Manifest(snapshotRep); } else { manifest = snapshotRep.GetType().TypeQualifiedName(); } return(new SnapshotEntry { Id = metadata.PersistenceId + "_" + metadata.SequenceNr, PersistenceId = metadata.PersistenceId, SequenceNr = metadata.SequenceNr, Snapshot = binary, Timestamp = metadata.Timestamp.Ticks, Manifest = manifest, SerializerId = serializer?.Identifier }); }
private SnapshotEntry ToSnapshotEntry(SnapshotMetadata metadata, object snapshot) { if (_settings.LegacySerialization) { var manifest = snapshot.GetType().TypeQualifiedName(); return(new SnapshotEntry { Id = metadata.PersistenceId + "_" + metadata.SequenceNr, PersistenceId = metadata.PersistenceId, SequenceNr = metadata.SequenceNr, Snapshot = snapshot, Timestamp = metadata.Timestamp.Ticks, Manifest = manifest, SerializerId = null }); } var snapshotRep = new Akka.Persistence.Serialization.Snapshot(snapshot); var serializer = _serialization.FindSerializerFor(snapshotRep); var binary = serializer.ToBinary(snapshotRep); var binaryManifest = Akka.Serialization.Serialization.ManifestFor(serializer, snapshotRep); return(new SnapshotEntry { Id = metadata.PersistenceId + "_" + metadata.SequenceNr, PersistenceId = metadata.PersistenceId, SequenceNr = metadata.SequenceNr, Snapshot = binary, Timestamp = metadata.Timestamp.Ticks, Manifest = binaryManifest, SerializerId = serializer?.Identifier }); }
public SnapshotEntry(SnapshotMetadata metadata, object snapshot, Akka.Serialization.Serialization serialization) { Snapshot = snapshot; Id = $"{DocumentType}-{metadata.PersistenceId}-{metadata.SequenceNr}"; SequenceNr = metadata.SequenceNr; Timestamp = new DateTimeJsonObject(metadata.Timestamp); PersistenceId = metadata.PersistenceId; Manifest = snapshot.GetType().AssemblyQualifiedName; Serializer serializer = serialization.FindSerializerFor(snapshot); if (serializer != null) { SerializerId = serializer.Identifier; if (serializer is SerializerWithStringManifest) { Manifest = ((SerializerWithStringManifest)serializer).Manifest(snapshot); } if (SerializerId.HasValue && SerializerId.Value == 1) { Snapshot = snapshot; } else { Snapshot = Convert.ToBase64String(serializer.ToBinary(snapshot)); } } }
internal JournalEntry(IPersistentRepresentation message, Akka.Serialization.Serialization serialization) { Id = $"{DocumentType}-{message.PersistenceId}-{message.SequenceNr}"; IsDeleted = message.IsDeleted; Payload = message.Payload; PersistenceId = message.PersistenceId; SequenceNr = message.SequenceNr; Manifest = message.Manifest; if (string.IsNullOrWhiteSpace(message.Manifest)) { Manifest = message.Payload.GetType().AssemblyQualifiedName; } Serializer serializer = serialization.FindSerializerFor(Payload); if (serializer != null) { SerializerId = serializer.Identifier; if (serializer is SerializerWithStringManifest) { Manifest = ((SerializerWithStringManifest)serializer).Manifest(message.Payload); } if (SerializerId.HasValue && SerializerId.Value == 1) { Payload = message.Payload; } else { Payload = Convert.ToBase64String(serializer.ToBinary(message.Payload)); } } }
private JournalEntry ToJournalEntry(IPersistentRepresentation message) { object payload = message.Payload; if (message.Payload is Tagged tagged) { payload = tagged.Payload; message = message.WithPayload(payload); // need to update the internal payload when working with tags } var serializer = _serialization.FindSerializerFor(message); var binary = serializer.ToBinary(message); return(new JournalEntry { Id = message.PersistenceId + "_" + message.SequenceNr, Ordering = new BsonTimestamp(0), // Auto-populates with timestamp IsDeleted = message.IsDeleted, Payload = binary, PersistenceId = message.PersistenceId, SequenceNr = message.SequenceNr, Manifest = string.Empty, // don't need a manifest here - it's embedded inside the PersistentMessage Tags = tagged.Tags?.ToList(), SerializerId = null // don't need a serializer ID here either; only for backwards-comat }); }
private JournalEntry ToJournalEntry(IPersistentRepresentation message) { object payload = message.Payload; if (message.Payload is Tagged tagged) { payload = tagged.Payload; message = message.WithPayload(payload); // need to update the internal payload when working with tags } // per https://github.com/akkadotnet/Akka.Persistence.MongoDB/issues/107 // BSON serialization if (_settings.LegacySerialization) { var manifest = string.IsNullOrEmpty(message.Manifest) ? payload.GetType().TypeQualifiedName() : message.Manifest; return(new JournalEntry { Id = message.PersistenceId + "_" + message.SequenceNr, Ordering = new BsonTimestamp(0), // Auto-populates with timestamp IsDeleted = message.IsDeleted, Payload = payload, PersistenceId = message.PersistenceId, SequenceNr = message.SequenceNr, Manifest = manifest, Tags = tagged.Tags?.ToList(), SerializerId = null // don't need a serializer ID here either; only for backwards-compat }); } // default serialization var serializer = _serialization.FindSerializerFor(message); var binary = serializer.ToBinary(message); return(new JournalEntry { Id = message.PersistenceId + "_" + message.SequenceNr, Ordering = new BsonTimestamp(0), // Auto-populates with timestamp IsDeleted = message.IsDeleted, Payload = binary, PersistenceId = message.PersistenceId, SequenceNr = message.SequenceNr, Manifest = string.Empty, // don't need a manifest here - it's embedded inside the PersistentMessage Tags = tagged.Tags?.ToList(), SerializerId = null // don't need a serializer ID here either; only for backwards-compat }); }
private ByteString SerializeSequencedOnNext(SequencedOnNext onNext) { var payload = onNext.Payload; var serializer = _serialization.FindSerializerFor(payload); var manifest = Akka.Serialization.Serialization.ManifestFor(serializer, payload); var p = new Payload { EnclosedMessage = ByteString.CopyFrom(serializer.ToBinary(payload)), SerializerId = serializer.Identifier }; if (!string.IsNullOrEmpty(manifest)) { p.MessageManifest = ByteString.CopyFromUtf8(manifest); } return(new Proto.Msg.SequencedOnNext { SeqNr = onNext.SeqNr, Payload = p }.ToByteString()); }
private static string SerializedToString <T>(T evt) { //XmlSerializer xmlSerializer = new XmlSerializer(evt.GetType()); //using (StringWriter textWriter = new StringWriter()) //{ // xmlSerializer.Serialize(textWriter, evt); // return textWriter.ToString(); //} ActorSystem system = ActorSystem.Create("example", new AutoTestAkkaConfiguration().ToStandAloneInMemorySystemConfig()); // Get the Serialization Extension Akka.Serialization.Serialization serialization = system.Serialization; // Find the Serializer for it Serializer serializer = serialization.FindSerializerFor(evt); //var serializedString = JsonConvert.SerializeObject(evt, new JsonSerializerSettings //{ // TypeNameHandling = TypeNameHandling.All //}); return(serializer.ToBinary(evt).ToString()); }
public PostgreSqlQueryExecutor(PostgreSqlQueryConfiguration configuration, Akka.Serialization.Serialization serialization) : base(configuration, serialization) { CreateSnapshotTableSql = $@" DO $do$ BEGIN IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{Configuration.SchemaName}' AND TABLE_NAME = '{Configuration.SnapshotTableName}') THEN CREATE TABLE {Configuration.FullSnapshotTableName} ( {Configuration.PersistenceIdColumnName} VARCHAR(255) NOT NULL, {Configuration.SequenceNrColumnName} BIGINT NOT NULL, {Configuration.TimestampColumnName} BIGINT NOT NULL, {Configuration.ManifestColumnName} VARCHAR(500) NOT NULL, {Configuration.PayloadColumnName} {configuration.StoredAs.ToString().ToUpperInvariant()} NOT NULL, CONSTRAINT {Configuration.SnapshotTableName}_pk PRIMARY KEY ({Configuration.PersistenceIdColumnName}, {Configuration.SequenceNrColumnName}) ); CREATE INDEX {Configuration.SnapshotTableName}_{Configuration.SequenceNrColumnName}_idx ON {Configuration.FullSnapshotTableName}({Configuration.SequenceNrColumnName}); CREATE INDEX {Configuration.SnapshotTableName}_{Configuration.TimestampColumnName}_idx ON {Configuration.FullSnapshotTableName}({Configuration.TimestampColumnName}); END IF; END $do$"; InsertSnapshotSql = $@" WITH upsert AS ( UPDATE {Configuration.FullSnapshotTableName} SET {Configuration.TimestampColumnName} = @Timestamp, {Configuration.PayloadColumnName} = @Payload WHERE {Configuration.PersistenceIdColumnName} = @PersistenceId AND {Configuration.SequenceNrColumnName} = @SequenceNr RETURNING *) INSERT INTO {Configuration.FullSnapshotTableName} ( {Configuration.PersistenceIdColumnName}, {Configuration.SequenceNrColumnName}, {Configuration.TimestampColumnName}, {Configuration.ManifestColumnName}, {Configuration.PayloadColumnName}) SELECT @PersistenceId, @SequenceNr, @Timestamp, @Manifest, @Payload WHERE NOT EXISTS (SELECT * FROM upsert)"; switch (configuration.StoredAs) { case StoredAsType.ByteA: _serialize = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Bytea, serialization.FindSerializerFor(e).ToBinary(e)); _deserialize = (type, serialized) => serialization.FindSerializerForType(type).FromBinary((byte[])serialized, type); break; case StoredAsType.JsonB: _serialize = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Jsonb, JsonConvert.SerializeObject(e, configuration.JsonSerializerSettings)); _deserialize = (type, serialized) => JsonConvert.DeserializeObject((string)serialized, type, configuration.JsonSerializerSettings); break; case StoredAsType.Json: _serialize = e => new KeyValuePair <NpgsqlDbType, object>(NpgsqlDbType.Json, JsonConvert.SerializeObject(e, configuration.JsonSerializerSettings)); _deserialize = (type, serialized) => JsonConvert.DeserializeObject((string)serialized, type, configuration.JsonSerializerSettings); break; default: throw new NotSupportedException($"{configuration.StoredAs} is not supported Db type for a payload"); } }