zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    iOS 字典实现原理
    IOS中armv7,armv7s,arm64以及i386和x86_64讲解
    SDWebImage源码解析
    iOS Runtime的消息转发机制
    二叉树的遍历
    LINUX 常用命令 ps 详解
    LINUX 文件权限详解
    LINUX查看内存使用情况 free
    PHP isset() empty() isnull() 的区别
    PHP unset()函数销毁变量 但没有实现释放内存
  • 原文地址:https://www.cnblogs.com/hangscer/p/8111285.html
Copyright © 2011-2022 走看看