Myra Codec Quickstart

Early Development Notice

All MVP.Express projects are currently in active development (pre-1.0.0) and should not be used in production environments. APIs may change without notice, and breaking changes are expected until each project reaches version 1.0.0. We welcome early adopters and contributors, but please use at your own risk.

Achieve zero-GC serialization with schema-driven code generation.

Prerequisites

  • Java 24+ with preview features enabled
  • Gradle 8.5+ or Maven 3.9+

Installation

Add to your build.gradle.kts:

plugins {
    id("express.mvp.myra-codegen") version "0.1.0-SNAPSHOT"
}

dependencies {
    implementation("express.mvp.myra:myra-codec:0.1.0-SNAPSHOT")
}

myraCodegen {
    schemaDir = file("src/main/resources/schemas")
    outputDir = file("build/generated/myra")
}

Define Your Schema

Create src/main/resources/schemas/order.myra.yml:

namespace: com.example.trading
version: 1

types:
  Order:
    fields:
      - name: orderId
        type: int64
      - name: symbol
        type: string
        maxLength: 8
      - name: price
        type: decimal
        precision: 18
        scale: 8
      - name: quantity
        type: int32
      - name: side
        type: enum
        values: [BUY, SELL]
      - name: timestamp
        type: int64

Generate Code

./gradlew generateMyra

This generates:

  • OrderBuilder - Flyweight writer for encoding
  • OrderFlyweight - Zero-copy reader for decoding

Encode Data

import com.example.trading.OrderBuilder;
import java.lang.foreign.Arena;

try (Arena arena = Arena.ofConfined()) {
    var segment = arena.allocate(256);
    var builder = new OrderBuilder();
    
    int bytesWritten = builder
        .wrap(segment, 0)
        .orderId(12345L)
        .symbol("AAPL")
        .price(150_00000000L)  // Fixed-point decimal
        .quantity(100)
        .side(Side.BUY)
        .timestamp(System.nanoTime())
        .build();
    
    // Send segment over network or write to file
}

Decode Data

import com.example.trading.OrderFlyweight;

var flyweight = new OrderFlyweight();
flyweight.wrap(receivedSegment, offset);

// Zero-copy access - no allocations!
long orderId = flyweight.orderId();
Utf8View symbol = flyweight.symbol();  // Returns view, not String
long price = flyweight.price();
int quantity = flyweight.quantity();

JVM Arguments

java --enable-preview --enable-native-access=ALL-UNNAMED -jar myapp.jar

Next Steps