Skip to content
Scala macros for compile-time generation of Kryo serializers
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benchmark/src Use var instead of val for benchmark constants to avoid constant-fold… May 22, 2018
macros/src
project
.gitignore Initial commit of kryo.Serializer macros. Oct 19, 2016
.travis.yml Update versions of Scala, plugins, and dependencies + add cross build… May 22, 2018
LICENSE Initial commit of kryo.Serializer macros. Oct 19, 2016
README.md Setting version to 1.2.0 May 25, 2018
build.sbt disable mima May 25, 2018
release.sbt Upgrade to latest Scala versions + add checking of binary compatibili… Jan 21, 2018
version.sbt Setting version to 1.2.1-SNAPSHOT May 25, 2018

README.md

Kryo Macros Build Status license version

Scala macros that generate com.esotericsoftware.kryo.Serializer implementations in compile time, based on compile time reflection.

Features and limitations

  • On top level only case classes are supported
  • Fields of case classes can be other case classes, Scala collections, options, primitive or AnyVal types & classes, tuples, Scala enums, standard types & classes: String, Either, BigDecimal, java.time.Instant, scala.concurrent.duration.FiniteDuration, org.joda.time.DateTime
  • Fields can be annotated as transient or just be not defined in constructor to avoid parsing and serializing
  • For nested structures need to generate serializers for all case classes
  • Implicitly defined mapping helpers are supported for ADT structures, simple alternative mappings, etc.
  • Manual serializers can be used in generated code when defined as implicits

How to use

Add the following resolver

resolvers += Resolver.bintrayRepo("evolutiongaming", "maven")

Add the library to your dependencies list

libraryDependencies += "com.evolutiongaming" %% "kryo-macros" % "1.2.0"

Generate some serializers for your case classes

import com.evolutiongaming.kryo.Serializer

case class Player(name: String)

val serializer = Serializer.make[Player]

That's it! You have generated a com.esotericsoftware.kryo.Serializer implementation for your Player. You must know what to do with it if you are here :)

To serialize objects that extends sealed traits/class use Serializer.makeCommon call:

import com.evolutiongaming.kryo.{ConstSerializer, Serializer}
 
sealed trait Reason
 
object Reason {
  case object Close extends Reason
  case object Pause extends Reason       
}

val reasonSerializer = Serializer.makeCommon[Reason] {
  case 0 => ConstSerializer(Reason.Close)
  case 1 => ConstSerializer(Reason.Pause)
}

sealed abstract class Message(val text: String)

object Message {
  case object Common extends Message("common")
  case object Notification extends Message("notification")
}

private implicit val messageSerializer = Serializer.makeMapping[Message] {
  case 0 => Message.Common   
  case 1 => Message.Notification
}

To see generated code just add the following line to your sbt build file

scalacOptions += "-Xmacro-settings:print-serializers"

For more examples, please, check out SerializerMacroSpec

How to develop

Run tests, check coverage & binary compatibility for both supported Scala versions

sbt ++2.11.12 clean coverage test coverageReport mimaReportBinaryIssues
sbt ++2.12.6 clean coverage test coverageReport mimaReportBinaryIssues
sbt ++2.13.0-M3 clean coverage test coverageReport mimaReportBinaryIssues
sbt ++2.13.0-M4 clean compile

Run benchmarks

sbt -no-colors clean 'benchmark/jmh:run -prof gc .*SerializerBenchmark.*' >results.txt

Release

For version numbering use Recommended Versioning Scheme that is widely adopted in the Scala ecosystem.

Double-check binary & source compatibility and release using following command (credentials required):

sbt release
You can’t perform that action at this time.