0

I am using aws dynamodb akka persistence API https://github.com/akka/akka-persistence-dynamodb which doesn't have a read journal API like Cassandra (Akka Persistence Query).

I can write journal data to dynamodb the event column is in string java object format my next task is to build CQRS using aws lambda or AWS Java API to read dynamodb, which has to convert the event data to human readble format.

Event Data:-

rO0ABXNyAD9jb20uY2Fwb25lLmJhbmsuYWN0b3JzLlBlcnNpc3RlbnRCYW5rQWNjb3VudCRCYW5rQWNjb3VudENyZWF0ZWQrGoMniq0AywIAAUwAC2JhbmtBY2NvdW50dAA6TGNvbS9jYXBvbmUvYmFuay9hY3RvcnMvUGVyc2lzdGVudEJhbmtBY2NvdW50JEJhbmtBY2NvdW50O3hwc3IAOGNvbS5jYXBvbmUuYmFuay5hY3RvcnMuUGVyc2lzdGVudEJhbmtBY2NvdW50JEJhbmtBY2NvdW5011CikshX3ysCAAREAAdiYWxhbmNlTAAIY3VycmVuY3l0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpZHEAfgAETAAEdXNlcnEAfgAEeHBAj0AAAAAAAHQAA0VVUnQAJDM5M2M2NmRiLTJhYmItNDEwNS04NWUyLWMwZjc3MzExMDNlM3QAB3JjYXJkaW4=

I want to know how to convert the above Java Object string value to human-reable format ? I tried using Java objectinputstream but I think I am doing something wrong.

Scala example:-

val eventData:String = "rO0ABXNyAD9jb20uY2Fwb25lLmJhbmsuYWN0b3JzLlBlcnNpc3RlbnRCYW5rQWNjb3VudCRCYW5rQWNjb3VudENyZWF0ZWQrGoMniq0AywIAAUwAC2JhbmtBY2NvdW50dAA6TGNvbS9jYXBvbmUvYmFuay9hY3RvcnMvUGVyc2lzdGVudEJhbmtBY2NvdW50JEJhbmtBY2NvdW50O3hwc3IAOGNvbS5jYXBvbmUuYmFuay5hY3RvcnMuUGVyc2lzdGVudEJhbmtBY2NvdW50JEJhbmtBY2NvdW5011CikshX3ysCAAREAAdiYWxhbmNlTAAIY3VycmVuY3l0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpZHEAfgAETAAEdXNlcnEAfgAEeHBAj0AAAAAAAHQAA0VVUnQAJDM5M2M2NmRiLTJhYmItNDEwNS04NWUyLWMwZjc3MzExMDNlM3QAB3JjYXJkaW4="
 
??? (and then what how to convert above string value to human reable format) 

Thanks Sri

  • 1
    How is that value generated? Look's like a base64 encoded version of `Object.toString`. – Gaël J Aug 31 '22 at 19:14
  • It happens here at persisted bank account where object gets persisted to dynamodb https://github.com/kali786516/akka-cassandra-DB-Bank/blob/26effdf531253cadd36dc194e9ebfdbe7b247cec/src/main/scala/com/databroccoli/bank/actors/PersistentBankAccount.scala#L63 – sri hari kali charan Tummala Aug 31 '22 at 20:43
  • I see the value in https://www.base64decode.org/ but still not the right expected format I do see special characters – sri hari kali charan Tummala Aug 31 '22 at 21:28
  • 1
    Verify what is the codec format. If you haven't define it (and you haven't disabled Java Serialization), it's most likely Java Serialization. However, to know what you are (de)serializing, you'd have to know what object was persisted by Akka Persistence. – Mateusz Kubuszok Aug 31 '22 at 23:04
  • @Mateusz Kubuszok yes it is Java serialization and I do know the objects bank account created and updated I did tried with custom serializer too https://github.com/kali786516/akka-cassandra-DB-Bank/blob/26effdf531253cadd36dc194e9ebfdbe7b247cec/src/main/scala/com/databroccoli/bank/actors/PersistentBankAccount.scala#L37 so on client side which is reading dyn table need to implement these custom serializer ? – sri hari kali charan Tummala Sep 01 '22 at 14:23
  • I did implement read journal for akka-persistence-dynamodb https://github.com/akka/akka-persistence-dynamodb/pull/114 – Joost de Vries Sep 13 '22 at 12:21
  • @Joost de Vries thank you I see you just merged 10 days ago anyway I lost my job but will keep in mind – sri hari kali charan Tummala Sep 18 '22 at 00:12

2 Answers2

0

ok was able to deserialize the object string data and convert it to json below is an example

object DeserializeData extends App {

  import java.io.ByteArrayInputStream
  import java.io.InputStream
  import java.io.ObjectInputStream
  import java.util.Base64
  import com.google.gson.Gson

  val base64encodedString = "rO0ABXNyAD9jb20uY2Fwb25lLmJhbmsuYWN0b3JzLlBlcnNpc3RlbnRCYW5rQWNjb3VudCRCYW5rQWNjb3VudENyZWF0ZWQrGoMniq0AlM3QAB3JjYXJkaW4="
  println("Base64 encoded string :" + base64encodedString)

  // Decode
  val base64decodedBytes = Base64.getDecoder.decode(base64encodedString)

  val in = new ByteArrayInputStream(base64decodedBytes)
  val obin = new ObjectInputStream(in)
  val `object` = obin.readObject
  println("Deserialised data: \n" + `object`.toString)
  // You could also try...
  println("Object class is " + `object`.getClass.toString)

  val json = new Gson();
  val resp = json.toJson(`object`)
  println(resp)



}
0

A feature to read aws Dynamodb read journal is now implemented no need of any kind of clunky code https://github.com/akka/akka-persistence-dynamodb/pull/114/files thank you Lightbend