This is an automated email from the ASF dual-hosted git repository.

fanningpj pushed a commit to branch 1.0.x
in repository https://gitbox.apache.org/repos/asf/incubator-pekko.git


The following commit(s) were added to refs/heads/1.0.x by this push:
     new 15aee50172 support reading akka-persistence snapshots (#837)
15aee50172 is described below

commit 15aee501720195d0c986c949343628b422dc38af
Author: PJ Fanning <[email protected]>
AuthorDate: Sat Dec 9 15:57:29 2023 +0100

    support reading akka-persistence snapshots (#837)
    
    * support reading akka-persistence snapshots
    
    * add test
    
    * Update SnapshotSerializerSpec.scala
    
    * Update SnapshotSerializerSpec.scala
---
 .../serialization/SnapshotSerializer.scala         | 10 ++++-
 .../serialization/SnapshotSerializerSpec.scala     | 48 ++++++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git 
a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
 
b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
index d189c77b45..e8e1c11927 100644
--- 
a/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
+++ 
b/persistence/src/main/scala/org/apache/pekko/persistence/serialization/SnapshotSerializer.scala
@@ -112,7 +112,15 @@ class SnapshotSerializer(val system: ExtendedActorSystem) 
extends BaseSerializer
 
     val (serializerId, manifest) = headerFromBinary(headerBytes)
 
-    serialization.deserialize(snapshotBytes, serializerId, manifest).get
+    // suggested in 
https://github.com/scullxbones/pekko-persistence-mongo/pull/14#issuecomment-1847223850
+    serialization
+      .deserialize(snapshotBytes, serializerId, manifest)
+      .recover {
+        case _: NotSerializableException if manifest.startsWith("akka") =>
+          serialization
+            .deserialize(snapshotBytes, serializerId, 
manifest.replaceFirst("akka", "org.apache.pekko"))
+      }
+      .get
   }
 
   private def writeInt(out: OutputStream, i: Int): Unit = {
diff --git 
a/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
 
b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
new file mode 100644
index 0000000000..824ff9c51f
--- /dev/null
+++ 
b/persistence/src/test/scala/org/apache/pekko/persistence/serialization/SnapshotSerializerSpec.scala
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pekko.persistence.serialization
+
+import org.apache.pekko
+import pekko.actor.ActorSystem
+import pekko.persistence.fsm.PersistentFSM.PersistentFSMSnapshot
+import pekko.serialization.SerializationExtension
+import pekko.testkit.PekkoSpec
+
+import java.util.Base64
+import scala.util.Success
+
+class SnapshotSerializerSpec extends PekkoSpec {
+
+  "Snapshot serializer" should {
+    "deserialize akka snapshots" in {
+      val system = ActorSystem()
+      val serialization = SerializationExtension(system)
+      // 
https://github.com/apache/incubator-pekko/pull/837#issuecomment-1847320309
+      val data =
+        
"PAAAAAcAAABha2thLnBlcnNpc3RlbmNlLmZzbS5QZXJzaXN0ZW50RlNNJFBlcnNpc3RlbnRGU01TbmFwc2hvdAoPdGVzdC1pZGVudGlmaWVyEg0IFBIJdGVzdC1kYXRh"
+      val bytes = Base64.getDecoder.decode(data)
+      val result = serialization.deserialize(bytes, classOf[Snapshot]).get
+      val deserialized = result.data
+      deserialized shouldBe a[Success[_]]
+      val innerResult = deserialized.asInstanceOf[Success[_]].get
+      innerResult shouldBe a[PersistentFSMSnapshot[_]]
+      val persistentFSMSnapshot = 
innerResult.asInstanceOf[PersistentFSMSnapshot[_]]
+      persistentFSMSnapshot shouldEqual 
PersistentFSMSnapshot[String]("test-identifier", "test-data", None)
+    }
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to