Class used for storing a Snapshot as BsonDocument
 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);
 }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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);
        }