private SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry) { return (new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), entry.Snapshot)); }
private SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry) { return new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), entry.Snapshot); }
private SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry) { var legacy = entry.SerializerId.HasValue || !string.IsNullOrEmpty(entry.Manifest); if (!legacy) { var ser = _serialization.FindSerializerForType(typeof(Serialization.Snapshot)); var snapshot = ser.FromBinary <Serialization.Snapshot>((byte[])entry.Snapshot); return(new SelectedSnapshot(new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr), snapshot.Data)); } int? serializerId = null; Type type = null; // legacy serialization if (!entry.SerializerId.HasValue && !string.IsNullOrEmpty(entry.Manifest)) { type = Type.GetType(entry.Manifest, true); } else { serializerId = entry.SerializerId; } if (entry.Snapshot is byte[] bytes) { object deserialized; if (serializerId.HasValue) { deserialized = _serialization.Deserialize(bytes, serializerId.Value, entry.Manifest); } else { var deserializer = _serialization.FindSerializerForType(type); deserialized = deserializer.FromBinary(bytes, type); } if (deserialized is Serialization.Snapshot snap) { return(new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), snap.Data)); } return(new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), deserialized)); } // backwards compat - loaded an old snapshot using BSON serialization. No need to deserialize via Akka.NET return(new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), entry.Snapshot)); }
private SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry) { Type type = null; if (!string.IsNullOrEmpty(entry.Manifest)) { type = Type.GetType(entry.Manifest, throwOnError: true); } var snapshot = _deserialize(type, entry.Snapshot, entry.Manifest, entry.SerializerId); return(new SelectedSnapshot( new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), snapshot)); }
protected override Task SaveAsync(SnapshotMetadata metadata, object snapshot) { var snapshotEntry = new SnapshotEntry { Id = metadata.PersistenceId + "_" + metadata.SequenceNr, PersistenceId = metadata.PersistenceId, SequenceNr = metadata.SequenceNr, Snapshot = snapshot, Timestamp = metadata.Timestamp.Ticks }; // throws a MongoWriteException if s snapshot with the same PersistenceId and SequenceNr // is inserted the second time. As @Horusiath pointed out, that's fine, because a second snapshot // without any events in the meantime doesn't make any sense. return(_collection.InsertOneAsync(snapshotEntry)); }
protected override Task SaveAsync(SnapshotMetadata metadata, object snapshot) { var snapshotEntry = new SnapshotEntry { Id = metadata.PersistenceId + "_" + metadata.SequenceNr, PersistenceId = metadata.PersistenceId, SequenceNr = metadata.SequenceNr, Snapshot = snapshot, Timestamp = metadata.Timestamp.Ticks }; // throws a MongoWriteException if s snapshot with the same PersistenceId and SequenceNr // is inserted the second time. As @Horusiath pointed out, that's fine, because a second snapshot // without any events in the meantime doesn't make any sense. return _collection.InsertOneAsync(snapshotEntry); }