コード例 #1
0
        /// <summary>
        /// TBD
        /// </summary>
        /// <param name="snapshot">TBD</param>
        /// <param name="command">TBD</param>
        protected virtual void SetPayloadParameter(object snapshot, DbCommand command)
        {
            var snapshotType = snapshot.GetType();
            var serializer   = Serialization.FindSerializerForType(snapshotType);

            var binary = serializer.ToBinary(snapshot);

            AddParameter(command, "@Payload", DbType.Binary, binary);
        }
コード例 #2
0
        private JournalEntry ToJournalEntry(IPersistentRepresentation message)
        {
            var payloadType = message.Payload.GetType();
            var serializer  = _serialization.FindSerializerForType(payloadType);

            return(new JournalEntry(message.PersistenceId, message.SequenceNr, message.IsDeleted,
                                    payloadType.QualifiedTypeName(), serializer.ToBinary(message.Payload)));
        }
コード例 #3
0
        private object GetPayload(DbDataReader reader, string manifest)
        {
            var type   = Type.GetType(manifest, true);
            var binary = (byte[])reader[PayloadIndex];

            var serializer = _serialization.FindSerializerForType(type);

            return(serializer.FromBinary(binary, type));
        }
コード例 #4
0
        private object GetPayload(DbDataReader reader)
        {
            var payloadType = reader.GetString(3);
            var type        = Type.GetType(payloadType, true);
            var binary      = (byte[])reader[4];

            var serializer = _serialization.FindSerializerForType(type);

            return(serializer.FromBinary(binary, type));
        }
コード例 #5
0
ファイル: QueryMapper.cs プロジェクト: zhanjian/akka.net
        private object GetSnapshot(DbDataReader reader)
        {
            var type       = Type.GetType(reader.GetString(3), true);
            var serializer = _serialization.FindSerializerForType(type);
            var binary     = (byte[])reader[4];

            var obj = serializer.FromBinary(binary, type);

            return(obj);
        }
コード例 #6
0
        private Serialization.Snapshot Deserialize(Stream stream)
        {
            var buffer = new byte[stream.Length];

            stream.Read(buffer, 0, buffer.Length);
            var snapshotType = typeof(Serialization.Snapshot);
            var serializer   = _serialization.FindSerializerForType(snapshotType, _defaultSerializer);
            var snapshot     = (Serialization.Snapshot)serializer.FromBinary(buffer, snapshotType);

            return(snapshot);
        }
コード例 #7
0
        public void MessageSerializer_when_given_payload_serializer_with_string_manifest_should_be_able_to_evolve_the_data_type()
        {
            var oldEvent    = new MyPayload("a");
            var serializer1 = _serialization.FindSerializerFor(oldEvent);
            var bytes       = serializer1.ToBinary(oldEvent);

            // now the system is updated to version 2 with new class MyPayload2
            // and MyPayload2Serializer that handles migration from old MyPayload
            var serializer2  = _serialization.FindSerializerForType(typeof(MyPayload2));
            var deserialized = serializer2.FromBinary(bytes, oldEvent.GetType());

            deserialized.ShouldBe(new MyPayload2(".a.", 0));
        }
コード例 #8
0
        private IPersistentRepresentation Map(JournalEntry e)
        {
            var persistenceId = e.PersistenceId;
            var sequenceNr    = e.SequenceNr;
            var isDeleted     = e.IsDeleted;

            var payloadType = e.PayloadType;
            var type        = Type.GetType(payloadType, true);

            var serializer = _serialization.FindSerializerForType(type);
            var payload    = serializer.FromBinary(e.Payload, type);

            return(new Persistent(payload, sequenceNr, persistenceId, isDeleted));
        }
コード例 #9
0
ファイル: QueryExecutor.cs プロジェクト: yfer/akka.net
        protected virtual IPersistentRepresentation ReadEvent(DbDataReader reader)
        {
            var persistenceId = reader.GetString(PersistenceIdIndex);
            var sequenceNr    = reader.GetInt64(SequenceNrIndex);
            var timestamp     = reader.GetInt64(TimestampIndex);
            var isDeleted     = reader.GetBoolean(IsDeletedIndex);
            var manifest      = reader.GetString(ManifestIndex);
            var payload       = reader[PayloadIndex];

            var type         = Type.GetType(manifest, true);
            var deserializer = Serialization.FindSerializerForType(type);
            var deserialized = deserializer.FromBinary((byte[])payload, type);

            return(new Persistent(deserialized, sequenceNr, persistenceId, manifest, isDeleted, ActorRefs.NoSender, null));
        }
コード例 #10
0
        /// <summary>
        /// Creates a new <see cref="LocalSnapshotStore"/> instance.
        /// </summary>
        public LocalSnapshotStore()
        {
            var config = Context.System.Settings.Config.GetConfig("akka.persistence.snapshot-store.local");

            _maxLoadAttempts = config.GetInt("max-load-attempts");

            _streamDispatcher = Context.System.Dispatchers.Lookup(config.GetString("stream-dispatcher"));
            _dir = new DirectoryInfo(config.GetString("dir"));

            _defaultSerializer = config.GetString("serializer");

            _serialization     = Context.System.Serialization;
            _wrapperSerializer = _serialization.FindSerializerForType(WrapperType);
            _saving            = new SortedSet <SnapshotMetadata>(SnapshotMetadata.Comparer); // saving in progress
            _log = Context.GetLogger();
        }
コード例 #11
0
        public SelectedSnapshot Map(SnapshotEntry e)
        {
            if (e == null)
            {
                return(null);
            }
            var persistenceId = e.PersistenceId;
            var sequenceNr    = e.SequenceNr;
            var timestamp     = e.Timestamp;

            var metadata = new SnapshotMetadata(persistenceId, sequenceNr, timestamp);

            var type       = Type.GetType(e.SnapshotType, true);
            var serializer = _serialization.FindSerializerForType(type);
            var binary     = e.Snapshot;

            var snapshot = serializer.FromBinary(binary, type);


            return(new SelectedSnapshot(metadata, snapshot));
        }
コード例 #12
0
        /// <summary>
        /// Creates a new <see cref="LocalSnapshotStore"/> instance.
        /// </summary>
        public LocalSnapshotStore()
        {
            var config = Context.System.Settings.Config.GetConfig("akka.persistence.snapshot-store.local");

            /*
             * if (config.IsNullOrEmpty())
             *  throw new ConfigurationException($"Cannot create {typeof(LocalSnapshotStore)}: akka.persistence.snapshot-store.local configuration node not found");
             */

            _maxLoadAttempts = config.GetInt("max-load-attempts", 0);

            _streamDispatcher = Context.System.Dispatchers.Lookup(config.GetString("stream-dispatcher", null));
            _dir = new DirectoryInfo(config.GetString("dir", null));

            _defaultSerializer = config.GetString("serializer", null);

            _serialization     = Context.System.Serialization;
            _wrapperSerializer = _serialization.FindSerializerForType(WrapperType);
            _saving            = new SortedSet <SnapshotMetadata>(SnapshotMetadata.Comparer); // saving in progress
            _log = Context.GetLogger();
        }
コード例 #13
0
 public void Serialization_must_resolve_DaemonMsgCreateSerializer()
 {
     _ser.FindSerializerForType(typeof(DaemonMsgCreate)).GetType().ShouldBe(typeof(DaemonMsgCreateSerializer));
 }
コード例 #14
0
        private Persistent ToPersistenceRepresentation(JournalEntry entry, IActorRef sender)
        {
            if (_settings.LegacySerialization)
            {
                var manifest = string.IsNullOrEmpty(entry.Manifest) ? entry.Payload.GetType().TypeQualifiedName() : entry.Manifest;

                return(new Persistent(
                           entry.Payload,
                           entry.SequenceNr,
                           entry.PersistenceId,
                           manifest,
                           entry.IsDeleted,
                           sender,
                           timestamp: ToTicks(entry.Ordering))); // MongoDb timestamps are stored as Unix Epoch
            }

            var legacy = entry.SerializerId.HasValue || !string.IsNullOrEmpty(entry.Manifest);

            if (!legacy)
            {
                var ser    = _serialization.FindSerializerForType(typeof(Persistent));
                var output = ser.FromBinary <Persistent>((byte[])entry.Payload);

                // backwards compatibility for https://github.com/akkadotnet/akka.net/pull/4680
                // it the timestamp is not defined in the binary payload
                if (output.Timestamp == 0L)
                {
                    output = (Persistent)output.WithTimestamp(ToTicks(entry.Ordering));
                }

                return(output);
            }

            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.Payload is byte[] bytes)
            {
                object deserialized = null;
                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 Persistent p)
                {
                    return((Persistent)p.WithTimestamp(ToTicks(entry.Ordering)));
                }

                return(new Persistent(deserialized, entry.SequenceNr, entry.PersistenceId, entry.Manifest, entry.IsDeleted, sender, timestamp: ToTicks(entry.Ordering)));
            }
            else // backwards compat for object serialization - Payload was already deserialized by BSON
            {
                return(new Persistent(entry.Payload, entry.SequenceNr, entry.PersistenceId, entry.Manifest,
                                      entry.IsDeleted, sender, timestamp: ToTicks(entry.Ordering)));
            }
        }
コード例 #15
0
        private SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry)
        {
            if (_settings.LegacySerialization)
            {
                return(new SelectedSnapshot(
                           new SnapshotMetadata(
                               entry.PersistenceId,
                               entry.SequenceNr,
                               new DateTime(entry.Timestamp)),
                           entry.Snapshot));
            }

            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));
        }