• Akka Serialization


    Akka本身使用了Protocol Buffers来序列化内部消息(比如gossip message)。Akka系统还可以配置自定义序列化机制。

    配置conf

    akka {
      actor {
        ## 在akka.actor.serializers中声明有哪些序列化方式
        serializers {
          java = "akka.serialization.JavaSerializer"
          proto = "akka.remote.serialization.ProtobufSerializer"
        }
        ## 在akka.actor.serialization-bindings中说明哪些类(基类或者接口)需要使用哪个特定的序列器
        ## 仅仅需要声明哪些接口或者抽象类
        ## 一个类的多个父类(接口)分别声明了不同的序列器,那么采用他们的最大公告s父类所使用的序列器
        serialization-bindings {
          "java.lang.String" = java
          "nathan.Frequency" = proto ##自定义trait
          "nathan.Frequency$" = proto ##自定义object
          "java.lang.Boolean" = proto
        }
      }
    }
    akka {
      actor {
        ## 序列化所有的消息(local actor和remote actor),可能在测试的时候使用
        serizlize-messages = on
      }
    }
    akka {
      actor {
        ## 序列化所有的Props(local和remote)
        serialize-creators = on
      }
    }
    

    默认的,在local actor之间(the same JVM)的消息是不会序列化的。可以通过akka.actor.serialize-message配置,来序列化所有消息(local和remote)。序列化所有的消息不回给性能带来提升,应当只在测试时使用。

    akka {
      actor {
        ## 序列化所有的消息(local actor和remote actor),可能在测试的时候使用
        serizlize-messages = on
      }
    }
    

    编程式手动获取类对应的序列器。

      val actorSystem = ActorSystem("akka1", ConfigFactory.load())
      val serialization = SerializationExtension(actorSystem)
      val original = "2122"
      val stringSerializer = serialization.findSerializerFor(original)
      val frequcecySerization =   serialization.findSerializerFor(Frequency)
    

    序列化某类的实例,得到Array[Byte]:

      val original = "2122"
      val stringSerializer = serialization.findSerializerFor(original)
      val array = stringSerializer.toBinary(original)
    

    反序列化Array[Byte]

      val back = stringSerializer.fromBinary(array, classOf[String]) //明确Class[_]
      println(back) //2122
      println(back.getClass) //class java.lang.String
    
      val back = stringSerializer.fromBinary(array)
      println(back) //2122
      println(back.getClass) //class java.lang.String
    
    知难行易
    原创博文,请勿转载
    我的又一个博客hangscer.win
  • 相关阅读:
    Linux Window Redis安装
    Mysql 死锁的详细分析方法
    mariadb rpm 安装
    我希望我能做到:我只是认真--做技术的人,对待技术,应该拥有什么样的态度?
    Google140道面试题
    mysql my.cnf配置文件详解
    Linux iostat字段解析
    Linux mpstat字段解析
    Selenium入门8 js调用
    Selenium入门7 内嵌框架iframe
  • 原文地址:https://www.cnblogs.com/hangscer/p/8111285.html
Copyright © 2020-2023  润新知