[{"data":1,"prerenderedAt":5452},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fbuilding\u002Fserdes":314,"\u002Fdocs\u002Fbuilding\u002Fserdes-surround":5447},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":145,"body":316,"description":5440,"extension":5441,"meta":5442,"navigation":5443,"pageType":5444,"path":146,"seo":5445,"stem":147,"__hash__":5446},"docs\u002F1.docs\u002F3.building\u002F9.serdes.md",{"type":317,"value":318,"toc":5422},"minimark",[319,333,336,435,440,443,471,478,481,488,814,821,854,865,868,880,1038,1043,1051,1432,1449,1612,1616,1629,2030,2038,2042,2047,2188,2197,2201,2217,2220,3129,3146,3167,3170,3189,3217,3790,3806,3824,3828,3834,3838,3853,3931,4026,4030,4040,4089,4387,4403,4407,4424,4716,4719,5063,5067,5082,5362,5377,5381,5418],[320,321,322,323,327,328,332],"p",{},"A ",[324,325,326],"strong",{},"serde"," (serializer + deserializer) tells StoatFlow how to turn your keys and values into bytes on the wire and back. Every source, sink, grouping, and state store needs a key serde and a value serde. StoatFlow uses the standard Kafka ",[329,330,331],"code",{},"org.apache.kafka.common.serialization.Serde\u003CT>"," type, so any serde you already use with Kafka Streams works unchanged.",[320,334,335],{},"This page covers where serdes are resolved (defaults vs. per-operator), the built-in serdes, writing your own, serializing windowed keys, and the Avro + Schema Registry integration.",[337,338,339],"tldr-panel",{},[340,341,342,361,389,406,418],"ul",{},[343,344,345,348,349,352,353,356,357,360],"li",{},[324,346,347],{},"Default serdes"," are set once on the runtime via ",[329,350,351],{},"streamsConfigOverrides { defaultKeySerde(...); defaultValueSerde(...) }"," (or the ",[329,354,355],{},"default-key-serde"," \u002F ",[329,358,359],{},"default-value-serde"," YAML keys).",[343,362,363,366,367,370,371,370,374,377,378,381,382,356,385,388],{},[324,364,365],{},"Per-operator serdes"," override the defaults via ",[329,368,369],{},"Consumed",", ",[329,372,373],{},"Produced",[329,375,376],{},"Grouped",", and ",[329,379,380],{},"Materialized"," — ",[329,383,384],{},".withKeySerde(...)",[329,386,387],{},".withValueSerde(...)",".",[343,390,391,394,395,398,399,370,402,405],{},[324,392,393],{},"Built-ins"," live in ",[329,396,397],{},"org.apache.kafka.common.serialization.Serdes"," (",[329,400,401],{},"Serdes.String()",[329,403,404],{},"Serdes.Long()",", …).",[343,407,408,411,412,356,415,388],{},[324,409,410],{},"Windowed keys"," use ",[329,413,414],{},"WindowedSerdes.timeWindowedSerdeFrom(inner)",[329,416,417],{},"sessionWindowedSerdeFrom(inner)",[343,419,420,423,424,427,428,377,431,434],{},[324,421,422],{},"Avro:"," use the Confluent ",[329,425,426],{},"SpecificAvroSerde",", point it at Schema Registry via ",[329,429,430],{},"schema-registry-url",[329,432,433],{},"configure(...)"," any serde you build by hand.",[436,437,439],"h2",{"id":438},"how-serdes-are-resolved","How serdes are resolved",[320,441,442],{},"StoatFlow resolves the serde for each operator in a fixed order:",[444,445,446,461],"ol",{},[343,447,448,381,451,370,453,370,455,457,458,460],{},[324,449,450],{},"An explicit serde on the operator's config object",[329,452,369],{},[329,454,373],{},[329,456,376],{},", or ",[329,459,380],{},". This always wins.",[343,462,463,466,467,470],{},[324,464,465],{},"The default key\u002Fvalue serde"," configured on the runtime — used whenever the operator config leaves the serde unset (",[329,468,469],{},"null",").",[320,472,473,474,477],{},"If neither is set, serialization fails at startup. The default serde is the convenient base case when most of your topology uses the same types (e.g. ",[329,475,476],{},"String"," keys); reach for per-operator serdes wherever an individual topic or store differs.",[436,479,347],{"id":480},"default-serdes",[320,482,483,484,487],{},"Set the application-wide default key and value serdes through ",[329,485,486],{},"streamsConfigOverrides"," when you build the runtime. These apply to every operator that doesn't specify its own serde.",[489,490,492,633],"code-tabs",{"group":491},"lang",[493,494,500],"pre",{"className":495,"code":496,"filename":497,"language":498,"meta":499,"style":499},"language-kotlin shiki shiki-themes vitesse-light","import io.stoatflow.runtime.StoatFlowRuntime\nimport org.apache.kafka.common.serialization.Serdes\n\nval runtime = StoatFlowRuntime.fromConfig(\n    topologyBuilder = { buildTopology(it) },\n    configure = {\n        streamsConfigOverrides {\n            defaultKeySerde(Serdes.String())\n            defaultValueSerde(Serdes.String())\n        }\n    },\n)\n","Kotlin","kotlin","",[329,501,502,515,523,530,553,570,581,589,603,615,621,627],{"__ignoreMap":499},[503,504,507,511],"span",{"class":505,"line":506},"line",1,[503,508,510],{"class":509},"sbBg2","import",[503,512,514],{"class":513},"sySUi"," io.stoatflow.runtime.StoatFlowRuntime\n",[503,516,518,520],{"class":505,"line":517},2,[503,519,510],{"class":509},[503,521,522],{"class":513}," org.apache.kafka.common.serialization.Serdes\n",[503,524,526],{"class":505,"line":525},3,[503,527,529],{"emptyLinePlaceholder":528},true,"\n",[503,531,533,536,540,544,547,550],{"class":505,"line":532},4,[503,534,535],{"class":509},"val",[503,537,539],{"class":538},"suHK_"," runtime ",[503,541,543],{"class":542},"sYZai","=",[503,545,546],{"class":538}," StoatFlowRuntime.",[503,548,549],{"class":513},"fromConfig",[503,551,552],{"class":538},"(\n",[503,554,556,559,561,564,567],{"class":505,"line":555},5,[503,557,558],{"class":538},"    topologyBuilder ",[503,560,543],{"class":542},[503,562,563],{"class":538}," { ",[503,565,566],{"class":513},"buildTopology",[503,568,569],{"class":538},"(it) },\n",[503,571,573,576,578],{"class":505,"line":572},6,[503,574,575],{"class":538},"    configure ",[503,577,543],{"class":542},[503,579,580],{"class":538}," {\n",[503,582,584,587],{"class":505,"line":583},7,[503,585,586],{"class":513},"        streamsConfigOverrides",[503,588,580],{"class":538},[503,590,592,595,598,600],{"class":505,"line":591},8,[503,593,594],{"class":513},"            defaultKeySerde",[503,596,597],{"class":538},"(Serdes.",[503,599,476],{"class":513},[503,601,602],{"class":538},"())\n",[503,604,606,609,611,613],{"class":505,"line":605},9,[503,607,608],{"class":513},"            defaultValueSerde",[503,610,597],{"class":538},[503,612,476],{"class":513},[503,614,602],{"class":538},[503,616,618],{"class":505,"line":617},10,[503,619,620],{"class":538},"        }\n",[503,622,624],{"class":505,"line":623},11,[503,625,626],{"class":538},"    },\n",[503,628,630],{"class":505,"line":629},12,[503,631,632],{"class":538},")\n",[493,634,639],{"className":635,"code":636,"filename":637,"language":638,"meta":499,"style":499},"language-java shiki shiki-themes vitesse-light","import io.stoatflow.runtime.StoatFlowRuntime;\nimport org.apache.kafka.common.serialization.Serdes;\n\nvar runtime = StoatFlowRuntime.fromConfig(\n    Main::buildTopology,\n    builder -> builder.streamsConfigOverrides(cfg -> {\n        cfg.defaultKeySerde(Serdes.String());\n        cfg.defaultValueSerde(Serdes.String());\n    })\n);\n","Java","java",[329,640,641,666,700,704,726,739,764,785,804,809],{"__ignoreMap":499},[503,642,643,645,648,650,653,655,658,660,663],{"class":505,"line":506},[503,644,510],{"class":509},[503,646,647],{"class":538}," io",[503,649,388],{"class":542},[503,651,652],{"class":538},"stoatflow",[503,654,388],{"class":542},[503,656,657],{"class":538},"runtime",[503,659,388],{"class":542},[503,661,662],{"class":538},"StoatFlowRuntime",[503,664,665],{"class":542},";\n",[503,667,668,670,673,675,678,680,683,685,688,690,693,695,698],{"class":505,"line":517},[503,669,510],{"class":509},[503,671,672],{"class":538}," org",[503,674,388],{"class":542},[503,676,677],{"class":538},"apache",[503,679,388],{"class":542},[503,681,682],{"class":538},"kafka",[503,684,388],{"class":542},[503,686,687],{"class":538},"common",[503,689,388],{"class":542},[503,691,692],{"class":538},"serialization",[503,694,388],{"class":542},[503,696,697],{"class":538},"Serdes",[503,699,665],{"class":542},[503,701,702],{"class":505,"line":525},[503,703,529],{"emptyLinePlaceholder":528},[503,705,706,710,714,717,720,722,724],{"class":505,"line":532},[503,707,709],{"class":708},"si04Y","var",[503,711,713],{"class":712},"svycV"," runtime",[503,715,716],{"class":542}," =",[503,718,719],{"class":712}," StoatFlowRuntime",[503,721,388],{"class":542},[503,723,549],{"class":513},[503,725,552],{"class":542},[503,727,728,731,734,736],{"class":505,"line":555},[503,729,730],{"class":538},"    Main",[503,732,733],{"class":509},"::",[503,735,566],{"class":538},[503,737,738],{"class":542},",\n",[503,740,741,744,747,750,752,754,757,760,762],{"class":505,"line":572},[503,742,743],{"class":538},"    builder ",[503,745,746],{"class":542},"->",[503,748,749],{"class":712}," builder",[503,751,388],{"class":542},[503,753,486],{"class":513},[503,755,756],{"class":542},"(",[503,758,759],{"class":538},"cfg ",[503,761,746],{"class":542},[503,763,580],{"class":542},[503,765,766,769,771,774,776,778,780,782],{"class":505,"line":583},[503,767,768],{"class":712},"        cfg",[503,770,388],{"class":542},[503,772,773],{"class":513},"defaultKeySerde",[503,775,756],{"class":542},[503,777,697],{"class":712},[503,779,388],{"class":542},[503,781,476],{"class":513},[503,783,784],{"class":542},"());\n",[503,786,787,789,791,794,796,798,800,802],{"class":505,"line":591},[503,788,768],{"class":712},[503,790,388],{"class":542},[503,792,793],{"class":513},"defaultValueSerde",[503,795,756],{"class":542},[503,797,697],{"class":712},[503,799,388],{"class":542},[503,801,476],{"class":513},[503,803,784],{"class":542},[503,805,806],{"class":505,"line":605},[503,807,808],{"class":542},"    })\n",[503,810,811],{"class":505,"line":617},[503,812,813],{"class":542},");\n",[320,815,816,817,820],{},"You can also set the defaults declaratively in ",[329,818,819],{},"application.yaml"," using the fully-qualified serde class name. The class must have a no-argument constructor; for parameterised serdes (e.g. Avro), set the instance in code instead.",[493,822,826],{"className":823,"code":824,"language":825,"meta":499,"style":499},"language-yaml shiki shiki-themes vitesse-light","stoatflow:\n  default-key-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n  # default-value-serde: ...\n","yaml",[329,827,828,836,848],{"__ignoreMap":499},[503,829,830,833],{"class":505,"line":506},[503,831,652],{"class":832},"su6XF",[503,834,835],{"class":542},":\n",[503,837,838,841,844],{"class":505,"line":517},[503,839,840],{"class":832},"  default-key-serde",[503,842,843],{"class":542},":",[503,845,847],{"class":846},"spphp"," org.apache.kafka.common.serialization.Serdes$StringSerde\n",[503,849,850],{"class":505,"line":525},[503,851,853],{"class":852},"s8zF2","  # default-value-serde: ...\n",[855,856,859],"callout",{"color":857,"icon":858},"info","i-lucide-info",[320,860,861,862,864],{},"Defaults set in ",[329,863,486],{}," take precedence over the YAML class-name form — use the YAML keys for serdes with a no-arg constructor, and the code form whenever you need to pass a configured serde instance.",[436,866,365],{"id":867},"per-operator-serdes",[320,869,870,871,874,875,356,877,879],{},"Each operator that touches Kafka or a state store takes a config object that carries serdes. All four follow the same shape: a ",[329,872,873],{},"with(keySerde, valueSerde)"," factory plus chained ",[329,876,384],{},[329,878,387],{}," builders.",[881,882,883,902],"table",{},[884,885,886],"thead",{},[887,888,889,893,896,899],"tr",{},[890,891,892],"th",{},"Config",[890,894,895],{},"Operators",[890,897,898],{},"Factory",[890,900,901],{},"Builders",[903,904,905,936,959,982,1008],"tbody",{},[887,906,907,913,923,928],{},[908,909,910],"td",{},[329,911,912],{},"Consumed\u003CK,V>",[908,914,915,370,918,370,920],{},[329,916,917],{},"stream",[329,919,881],{},[329,921,922],{},"globalTable",[908,924,925],{},[329,926,927],{},"Consumed.with(k, v)",[908,929,930,370,933],{},[329,931,932],{},".withKeySerde",[329,934,935],{},".withValueSerde",[887,937,938,943,948,953],{},[908,939,940],{},[329,941,942],{},"Produced\u003CK,V>",[908,944,945],{},[329,946,947],{},"to",[908,949,950],{},[329,951,952],{},"Produced.with(k, v)",[908,954,955,370,957],{},[329,956,932],{},[329,958,935],{},[887,960,961,966,971,976],{},[908,962,963],{},[329,964,965],{},"Repartitioned\u003CK,V>",[908,967,968],{},[329,969,970],{},"repartition",[908,972,973],{},[329,974,975],{},"Repartitioned.with(k, v)",[908,977,978,370,980],{},[329,979,932],{},[329,981,935],{},[887,983,984,989,997,1002],{},[908,985,986],{},[329,987,988],{},"Grouped\u003CK,V>",[908,990,991,370,994],{},[329,992,993],{},"groupByKey",[329,995,996],{},"groupBy",[908,998,999],{},[329,1000,1001],{},"Grouped.with(k, v)",[908,1003,1004,370,1006],{},[329,1005,932],{},[329,1007,935],{},[887,1009,1010,1015,1027,1032],{},[908,1011,1012],{},[329,1013,1014],{},"Materialized\u003CK,V,S>",[908,1016,1017,370,1020,370,1023,1026],{},[329,1018,1019],{},"count",[329,1021,1022],{},"reduce",[329,1024,1025],{},"aggregate",", joins",[908,1028,1029],{},[329,1030,1031],{},"Materialized.with(k, v)",[908,1033,1034,370,1036],{},[329,1035,932],{},[329,1037,935],{},[1039,1040,1042],"h3",{"id":1041},"source-and-sink","Source and sink",[320,1044,1045,1047,1048,1050],{},[329,1046,369],{}," controls how a source topic is deserialized; ",[329,1049,373],{}," controls how a sink topic is serialized.",[489,1052,1053,1184],{"group":491},[493,1054,1056],{"className":495,"code":1055,"filename":497,"language":498,"meta":499,"style":499},"import io.stoatflow.core.topology.Consumed\nimport io.stoatflow.core.topology.Produced\nimport org.apache.kafka.common.serialization.Serdes\n\n\u002F\u002F Source: String keys, Long values\nval numbers = builder.stream(\n    \"input\",\n    Consumed.with(Serdes.String(), Serdes.Long()),\n)\n\n\u002F\u002F Sink: String keys, Long values\nnumbers.to(\n    \"output\",\n    Produced.with(Serdes.String(), Serdes.Long()),\n)\n",[329,1057,1058,1065,1072,1078,1082,1087,1103,1110,1131,1135,1139,1144,1153,1161,1179],{"__ignoreMap":499},[503,1059,1060,1062],{"class":505,"line":506},[503,1061,510],{"class":509},[503,1063,1064],{"class":513}," io.stoatflow.core.topology.Consumed\n",[503,1066,1067,1069],{"class":505,"line":517},[503,1068,510],{"class":509},[503,1070,1071],{"class":513}," io.stoatflow.core.topology.Produced\n",[503,1073,1074,1076],{"class":505,"line":525},[503,1075,510],{"class":509},[503,1077,522],{"class":513},[503,1079,1080],{"class":505,"line":532},[503,1081,529],{"emptyLinePlaceholder":528},[503,1083,1084],{"class":505,"line":555},[503,1085,1086],{"class":852},"\u002F\u002F Source: String keys, Long values\n",[503,1088,1089,1091,1094,1096,1099,1101],{"class":505,"line":572},[503,1090,535],{"class":509},[503,1092,1093],{"class":538}," numbers ",[503,1095,543],{"class":542},[503,1097,1098],{"class":538}," builder.",[503,1100,917],{"class":513},[503,1102,552],{"class":538},[503,1104,1105,1108],{"class":505,"line":583},[503,1106,1107],{"class":846},"    \"input\"",[503,1109,738],{"class":538},[503,1111,1112,1115,1118,1120,1122,1125,1128],{"class":505,"line":591},[503,1113,1114],{"class":538},"    Consumed.",[503,1116,1117],{"class":513},"with",[503,1119,597],{"class":538},[503,1121,476],{"class":513},[503,1123,1124],{"class":538},"(), Serdes.",[503,1126,1127],{"class":513},"Long",[503,1129,1130],{"class":538},"()),\n",[503,1132,1133],{"class":505,"line":605},[503,1134,632],{"class":538},[503,1136,1137],{"class":505,"line":617},[503,1138,529],{"emptyLinePlaceholder":528},[503,1140,1141],{"class":505,"line":623},[503,1142,1143],{"class":852},"\u002F\u002F Sink: String keys, Long values\n",[503,1145,1146,1149,1151],{"class":505,"line":629},[503,1147,1148],{"class":538},"numbers.",[503,1150,947],{"class":513},[503,1152,552],{"class":538},[503,1154,1156,1159],{"class":505,"line":1155},13,[503,1157,1158],{"class":846},"    \"output\"",[503,1160,738],{"class":538},[503,1162,1164,1167,1169,1171,1173,1175,1177],{"class":505,"line":1163},14,[503,1165,1166],{"class":538},"    Produced.",[503,1168,1117],{"class":513},[503,1170,597],{"class":538},[503,1172,476],{"class":513},[503,1174,1124],{"class":538},[503,1176,1127],{"class":513},[503,1178,1130],{"class":538},[503,1180,1182],{"class":505,"line":1181},15,[503,1183,632],{"class":538},[493,1185,1187],{"className":635,"code":1186,"filename":637,"language":638,"meta":499,"style":499},"import io.stoatflow.core.topology.Consumed;\nimport io.stoatflow.core.topology.KStream;\nimport io.stoatflow.core.topology.Produced;\nimport org.apache.kafka.common.serialization.Serdes;\n\n\u002F\u002F Source: String keys, Long values\nKStream\u003CString, Long> numbers = builder.stream(\n    \"input\",\n    Consumed.with(Serdes.String(), Serdes.Long()));\n\n\u002F\u002F Sink: String keys, Long values\nnumbers.to(\n    \"output\",\n    Produced.with(Serdes.String(), Serdes.Long()));\n",[329,1188,1189,1215,1240,1264,1292,1296,1300,1331,1345,1375,1379,1383,1394,1405],{"__ignoreMap":499},[503,1190,1191,1193,1195,1197,1199,1201,1204,1206,1209,1211,1213],{"class":505,"line":506},[503,1192,510],{"class":509},[503,1194,647],{"class":538},[503,1196,388],{"class":542},[503,1198,652],{"class":538},[503,1200,388],{"class":542},[503,1202,1203],{"class":538},"core",[503,1205,388],{"class":542},[503,1207,1208],{"class":538},"topology",[503,1210,388],{"class":542},[503,1212,369],{"class":538},[503,1214,665],{"class":542},[503,1216,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1238],{"class":505,"line":517},[503,1218,510],{"class":509},[503,1220,647],{"class":538},[503,1222,388],{"class":542},[503,1224,652],{"class":538},[503,1226,388],{"class":542},[503,1228,1203],{"class":538},[503,1230,388],{"class":542},[503,1232,1208],{"class":538},[503,1234,388],{"class":542},[503,1236,1237],{"class":538},"KStream",[503,1239,665],{"class":542},[503,1241,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262],{"class":505,"line":525},[503,1243,510],{"class":509},[503,1245,647],{"class":538},[503,1247,388],{"class":542},[503,1249,652],{"class":538},[503,1251,388],{"class":542},[503,1253,1203],{"class":538},[503,1255,388],{"class":542},[503,1257,1208],{"class":538},[503,1259,388],{"class":542},[503,1261,373],{"class":538},[503,1263,665],{"class":542},[503,1265,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290],{"class":505,"line":532},[503,1267,510],{"class":509},[503,1269,672],{"class":538},[503,1271,388],{"class":542},[503,1273,677],{"class":538},[503,1275,388],{"class":542},[503,1277,682],{"class":538},[503,1279,388],{"class":542},[503,1281,687],{"class":538},[503,1283,388],{"class":542},[503,1285,692],{"class":538},[503,1287,388],{"class":542},[503,1289,697],{"class":538},[503,1291,665],{"class":542},[503,1293,1294],{"class":505,"line":555},[503,1295,529],{"emptyLinePlaceholder":528},[503,1297,1298],{"class":505,"line":572},[503,1299,1086],{"class":852},[503,1301,1302,1304,1307,1309,1312,1315,1318,1321,1323,1325,1327,1329],{"class":505,"line":583},[503,1303,1237],{"class":538},[503,1305,1306],{"class":542},"\u003C",[503,1308,476],{"class":708},[503,1310,1311],{"class":542},",",[503,1313,1314],{"class":708}," Long",[503,1316,1317],{"class":542},">",[503,1319,1320],{"class":712}," numbers",[503,1322,716],{"class":542},[503,1324,749],{"class":712},[503,1326,388],{"class":542},[503,1328,917],{"class":513},[503,1330,552],{"class":542},[503,1332,1333,1337,1340,1343],{"class":505,"line":591},[503,1334,1336],{"class":1335},"sSP4y","    \"",[503,1338,1339],{"class":846},"input",[503,1341,1342],{"class":1335},"\"",[503,1344,738],{"class":542},[503,1346,1347,1350,1352,1354,1356,1358,1360,1362,1365,1368,1370,1372],{"class":505,"line":605},[503,1348,1349],{"class":712},"    Consumed",[503,1351,388],{"class":542},[503,1353,1117],{"class":513},[503,1355,756],{"class":542},[503,1357,697],{"class":712},[503,1359,388],{"class":542},[503,1361,476],{"class":513},[503,1363,1364],{"class":542},"(),",[503,1366,1367],{"class":712}," Serdes",[503,1369,388],{"class":542},[503,1371,1127],{"class":513},[503,1373,1374],{"class":542},"()));\n",[503,1376,1377],{"class":505,"line":617},[503,1378,529],{"emptyLinePlaceholder":528},[503,1380,1381],{"class":505,"line":623},[503,1382,1143],{"class":852},[503,1384,1385,1388,1390,1392],{"class":505,"line":629},[503,1386,1387],{"class":712},"numbers",[503,1389,388],{"class":542},[503,1391,947],{"class":513},[503,1393,552],{"class":542},[503,1395,1396,1398,1401,1403],{"class":505,"line":1155},[503,1397,1336],{"class":1335},[503,1399,1400],{"class":846},"output",[503,1402,1342],{"class":1335},[503,1404,738],{"class":542},[503,1406,1407,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430],{"class":505,"line":1163},[503,1408,1409],{"class":712},"    Produced",[503,1411,388],{"class":542},[503,1413,1117],{"class":513},[503,1415,756],{"class":542},[503,1417,697],{"class":712},[503,1419,388],{"class":542},[503,1421,476],{"class":513},[503,1423,1364],{"class":542},[503,1425,1367],{"class":712},[503,1427,388],{"class":542},[503,1429,1127],{"class":513},[503,1431,1374],{"class":542},[320,1433,1434,1435,356,1438,1441,1442,1446,1447,843],{},"When you only need to override one of the two serdes (the other coming from the defaults), use the named factory or the builder form. ",[329,1436,1437],{},"Consumed.as(...)",[329,1439,1440],{},"Produced.as(...)"," set only the operator name and leave both serdes on the defaults — that is the pattern the ",[1443,1444,1445],"a",{"href":29},"first app"," uses, where the sink overrides just the value serde because counts are ",[329,1448,1127],{},[489,1450,1451,1526],{"group":491},[493,1452,1454],{"className":495,"code":1453,"filename":497,"language":498,"meta":499,"style":499},".to(\n    \"word-counts\",\n    Produced.`as`\u003CString, Long>(\"sink\")\n        .withKeySerde(Serdes.String())\n        .withValueSerde(Serdes.Long()),\n)\n",[329,1455,1456,1464,1471,1495,1509,1522],{"__ignoreMap":499},[503,1457,1458,1460,1462],{"class":505,"line":506},[503,1459,388],{"class":538},[503,1461,947],{"class":513},[503,1463,552],{"class":538},[503,1465,1466,1469],{"class":505,"line":517},[503,1467,1468],{"class":846},"    \"word-counts\"",[503,1470,738],{"class":538},[503,1472,1473,1475,1478,1480,1483,1485,1487,1490,1493],{"class":505,"line":525},[503,1474,1166],{"class":538},[503,1476,1477],{"class":513},"`as`",[503,1479,1306],{"class":538},[503,1481,476],{"class":1482},"sUxyF",[503,1484,370],{"class":538},[503,1486,1127],{"class":1482},[503,1488,1489],{"class":538},">(",[503,1491,1492],{"class":846},"\"sink\"",[503,1494,632],{"class":538},[503,1496,1497,1500,1503,1505,1507],{"class":505,"line":532},[503,1498,1499],{"class":538},"        .",[503,1501,1502],{"class":513},"withKeySerde",[503,1504,597],{"class":538},[503,1506,476],{"class":513},[503,1508,602],{"class":538},[503,1510,1511,1513,1516,1518,1520],{"class":505,"line":555},[503,1512,1499],{"class":538},[503,1514,1515],{"class":513},"withValueSerde",[503,1517,597],{"class":538},[503,1519,1127],{"class":513},[503,1521,1130],{"class":538},[503,1523,1524],{"class":505,"line":572},[503,1525,632],{"class":538},[493,1527,1529],{"className":635,"code":1528,"filename":637,"language":638,"meta":499,"style":499},".to(\n    \"word-counts\",\n    Produced.\u003CString, Long>as(\"sink\")\n        .withKeySerde(Serdes.String())\n        .withValueSerde(Serdes.Long()));\n",[329,1530,1531,1539,1550,1580,1596],{"__ignoreMap":499},[503,1532,1533,1535,1537],{"class":505,"line":506},[503,1534,388],{"class":542},[503,1536,947],{"class":513},[503,1538,552],{"class":542},[503,1540,1541,1543,1546,1548],{"class":505,"line":517},[503,1542,1336],{"class":1335},[503,1544,1545],{"class":846},"word-counts",[503,1547,1342],{"class":1335},[503,1549,738],{"class":542},[503,1551,1552,1554,1556,1558,1560,1562,1564,1566,1569,1571,1573,1576,1578],{"class":505,"line":525},[503,1553,1409],{"class":538},[503,1555,388],{"class":542},[503,1557,1306],{"class":708},[503,1559,476],{"class":538},[503,1561,1311],{"class":542},[503,1563,1314],{"class":538},[503,1565,1317],{"class":708},[503,1567,1568],{"class":513},"as",[503,1570,756],{"class":542},[503,1572,1342],{"class":1335},[503,1574,1575],{"class":846},"sink",[503,1577,1342],{"class":1335},[503,1579,632],{"class":542},[503,1581,1582,1584,1586,1588,1590,1592,1594],{"class":505,"line":532},[503,1583,1499],{"class":542},[503,1585,1502],{"class":513},[503,1587,756],{"class":542},[503,1589,697],{"class":712},[503,1591,388],{"class":542},[503,1593,476],{"class":513},[503,1595,602],{"class":542},[503,1597,1598,1600,1602,1604,1606,1608,1610],{"class":505,"line":555},[503,1599,1499],{"class":542},[503,1601,1515],{"class":513},[503,1603,756],{"class":542},[503,1605,697],{"class":712},[503,1607,388],{"class":542},[503,1609,1127],{"class":513},[503,1611,1374],{"class":542},[1039,1613,1615],{"id":1614},"grouping-and-aggregation","Grouping and aggregation",[320,1617,322,1618,356,1620,1622,1623,1625,1626,1628],{},[329,1619,996],{},[329,1621,993],{}," re-serializes records as it re-keys them, so the grouping serdes must match the post-grouping key and value types. ",[329,1624,376],{}," carries those serdes; if a downstream aggregation materializes state, ",[329,1627,380],{}," carries the store's serdes (which may differ — the aggregate value type is often not the input value type).",[489,1630,1631,1781],{"group":491},[493,1632,1634],{"className":495,"code":1633,"filename":497,"language":498,"meta":499,"style":499},"import io.stoatflow.core.state.StateStore\nimport io.stoatflow.core.topology.Grouped\nimport io.stoatflow.core.topology.Materialized\nimport org.apache.kafka.common.serialization.Serdes\n\nstream\n    .groupBy(\n        { _, value -> value.category },\n        Grouped.with(Serdes.String(), productSerde),\n    )\n    .count(\n        Materialized.`as`\u003CString, Long, StateStore>(\"counts-by-category\")\n            .withKeySerde(Serdes.String())\n            .withValueSerde(Serdes.Long()),\n    )\n",[329,1635,1636,1643,1650,1657,1663,1667,1672,1681,1698,1712,1717,1725,1752,1765,1777],{"__ignoreMap":499},[503,1637,1638,1640],{"class":505,"line":506},[503,1639,510],{"class":509},[503,1641,1642],{"class":513}," io.stoatflow.core.state.StateStore\n",[503,1644,1645,1647],{"class":505,"line":517},[503,1646,510],{"class":509},[503,1648,1649],{"class":513}," io.stoatflow.core.topology.Grouped\n",[503,1651,1652,1654],{"class":505,"line":525},[503,1653,510],{"class":509},[503,1655,1656],{"class":513}," io.stoatflow.core.topology.Materialized\n",[503,1658,1659,1661],{"class":505,"line":532},[503,1660,510],{"class":509},[503,1662,522],{"class":513},[503,1664,1665],{"class":505,"line":555},[503,1666,529],{"emptyLinePlaceholder":528},[503,1668,1669],{"class":505,"line":572},[503,1670,1671],{"class":538},"stream\n",[503,1673,1674,1677,1679],{"class":505,"line":583},[503,1675,1676],{"class":538},"    .",[503,1678,996],{"class":513},[503,1680,552],{"class":538},[503,1682,1683,1686,1689,1692,1695],{"class":505,"line":591},[503,1684,1685],{"class":538},"        { _, ",[503,1687,1688],{"class":708},"value",[503,1690,1691],{"class":542}," ->",[503,1693,1694],{"class":708}," value",[503,1696,1697],{"class":538},".category },\n",[503,1699,1700,1703,1705,1707,1709],{"class":505,"line":605},[503,1701,1702],{"class":538},"        Grouped.",[503,1704,1117],{"class":513},[503,1706,597],{"class":538},[503,1708,476],{"class":513},[503,1710,1711],{"class":538},"(), productSerde),\n",[503,1713,1714],{"class":505,"line":617},[503,1715,1716],{"class":538},"    )\n",[503,1718,1719,1721,1723],{"class":505,"line":623},[503,1720,1676],{"class":538},[503,1722,1019],{"class":513},[503,1724,552],{"class":538},[503,1726,1727,1730,1732,1734,1736,1738,1740,1742,1745,1747,1750],{"class":505,"line":629},[503,1728,1729],{"class":538},"        Materialized.",[503,1731,1477],{"class":513},[503,1733,1306],{"class":538},[503,1735,476],{"class":1482},[503,1737,370],{"class":538},[503,1739,1127],{"class":1482},[503,1741,370],{"class":538},[503,1743,1744],{"class":1482},"StateStore",[503,1746,1489],{"class":538},[503,1748,1749],{"class":846},"\"counts-by-category\"",[503,1751,632],{"class":538},[503,1753,1754,1757,1759,1761,1763],{"class":505,"line":1155},[503,1755,1756],{"class":538},"            .",[503,1758,1502],{"class":513},[503,1760,597],{"class":538},[503,1762,476],{"class":513},[503,1764,602],{"class":538},[503,1766,1767,1769,1771,1773,1775],{"class":505,"line":1163},[503,1768,1756],{"class":538},[503,1770,1515],{"class":513},[503,1772,597],{"class":538},[503,1774,1127],{"class":513},[503,1776,1130],{"class":538},[503,1778,1779],{"class":505,"line":1181},[503,1780,1716],{"class":538},[493,1782,1784],{"className":635,"code":1783,"filename":637,"language":638,"meta":499,"style":499},"import io.stoatflow.core.state.StateStore;\nimport io.stoatflow.core.topology.Grouped;\nimport io.stoatflow.core.topology.Materialized;\nimport org.apache.kafka.common.serialization.Serdes;\n\nstream\n    .groupBy(\n        (key, value) -> value.category(),\n        Grouped.with(Serdes.String(), productSerde))\n    .count(\n        Materialized.\u003CString, Long, StateStore>as(\"counts-by-category\")\n            .withKeySerde(Serdes.String())\n            .withValueSerde(Serdes.Long()));\n",[329,1785,1786,1811,1835,1859,1887,1891,1895,1903,1930,1955,1963,1998,2014],{"__ignoreMap":499},[503,1787,1788,1790,1792,1794,1796,1798,1800,1802,1805,1807,1809],{"class":505,"line":506},[503,1789,510],{"class":509},[503,1791,647],{"class":538},[503,1793,388],{"class":542},[503,1795,652],{"class":538},[503,1797,388],{"class":542},[503,1799,1203],{"class":538},[503,1801,388],{"class":542},[503,1803,1804],{"class":538},"state",[503,1806,388],{"class":542},[503,1808,1744],{"class":538},[503,1810,665],{"class":542},[503,1812,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833],{"class":505,"line":517},[503,1814,510],{"class":509},[503,1816,647],{"class":538},[503,1818,388],{"class":542},[503,1820,652],{"class":538},[503,1822,388],{"class":542},[503,1824,1203],{"class":538},[503,1826,388],{"class":542},[503,1828,1208],{"class":538},[503,1830,388],{"class":542},[503,1832,376],{"class":538},[503,1834,665],{"class":542},[503,1836,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857],{"class":505,"line":525},[503,1838,510],{"class":509},[503,1840,647],{"class":538},[503,1842,388],{"class":542},[503,1844,652],{"class":538},[503,1846,388],{"class":542},[503,1848,1203],{"class":538},[503,1850,388],{"class":542},[503,1852,1208],{"class":538},[503,1854,388],{"class":542},[503,1856,380],{"class":538},[503,1858,665],{"class":542},[503,1860,1861,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885],{"class":505,"line":532},[503,1862,510],{"class":509},[503,1864,672],{"class":538},[503,1866,388],{"class":542},[503,1868,677],{"class":538},[503,1870,388],{"class":542},[503,1872,682],{"class":538},[503,1874,388],{"class":542},[503,1876,687],{"class":538},[503,1878,388],{"class":542},[503,1880,692],{"class":538},[503,1882,388],{"class":542},[503,1884,697],{"class":538},[503,1886,665],{"class":542},[503,1888,1889],{"class":505,"line":555},[503,1890,529],{"emptyLinePlaceholder":528},[503,1892,1893],{"class":505,"line":572},[503,1894,1671],{"class":538},[503,1896,1897,1899,1901],{"class":505,"line":583},[503,1898,1676],{"class":542},[503,1900,996],{"class":513},[503,1902,552],{"class":542},[503,1904,1905,1908,1911,1913,1915,1918,1920,1922,1924,1927],{"class":505,"line":591},[503,1906,1907],{"class":542},"        (",[503,1909,1910],{"class":538},"key",[503,1912,1311],{"class":542},[503,1914,1694],{"class":538},[503,1916,1917],{"class":542},")",[503,1919,1691],{"class":542},[503,1921,1694],{"class":712},[503,1923,388],{"class":542},[503,1925,1926],{"class":513},"category",[503,1928,1929],{"class":542},"(),\n",[503,1931,1932,1935,1937,1939,1941,1943,1945,1947,1949,1952],{"class":505,"line":605},[503,1933,1934],{"class":712},"        Grouped",[503,1936,388],{"class":542},[503,1938,1117],{"class":513},[503,1940,756],{"class":542},[503,1942,697],{"class":712},[503,1944,388],{"class":542},[503,1946,476],{"class":513},[503,1948,1364],{"class":542},[503,1950,1951],{"class":538}," productSerde",[503,1953,1954],{"class":542},"))\n",[503,1956,1957,1959,1961],{"class":505,"line":617},[503,1958,1676],{"class":542},[503,1960,1019],{"class":513},[503,1962,552],{"class":542},[503,1964,1965,1968,1970,1972,1974,1976,1978,1980,1983,1985,1987,1989,1991,1994,1996],{"class":505,"line":623},[503,1966,1967],{"class":538},"        Materialized",[503,1969,388],{"class":542},[503,1971,1306],{"class":708},[503,1973,476],{"class":538},[503,1975,1311],{"class":542},[503,1977,1314],{"class":538},[503,1979,1311],{"class":542},[503,1981,1982],{"class":538}," StateStore",[503,1984,1317],{"class":708},[503,1986,1568],{"class":513},[503,1988,756],{"class":542},[503,1990,1342],{"class":1335},[503,1992,1993],{"class":846},"counts-by-category",[503,1995,1342],{"class":1335},[503,1997,632],{"class":542},[503,1999,2000,2002,2004,2006,2008,2010,2012],{"class":505,"line":629},[503,2001,1756],{"class":542},[503,2003,1502],{"class":513},[503,2005,756],{"class":542},[503,2007,697],{"class":712},[503,2009,388],{"class":542},[503,2011,476],{"class":513},[503,2013,602],{"class":542},[503,2015,2016,2018,2020,2022,2024,2026,2028],{"class":505,"line":1155},[503,2017,1756],{"class":542},[503,2019,1515],{"class":513},[503,2021,756],{"class":542},[503,2023,697],{"class":712},[503,2025,388],{"class":542},[503,2027,1127],{"class":513},[503,2029,1374],{"class":542},[320,2031,2032,2034,2035,2037],{},[329,2033,380],{}," carries far more than serdes (store type, changelog, caching, retention). See ",[1443,2036,100],{"href":101}," for the rest; this page covers only its serde configuration.",[436,2039,2041],{"id":2040},"built-in-serdes","Built-in serdes",[320,2043,2044,2045,843],{},"The standard Kafka serdes cover the common primitive and byte types. They're factory methods on ",[329,2046,397],{},[881,2048,2049,2058],{},[884,2050,2051],{},[887,2052,2053,2056],{},[890,2054,2055],{},"Type",[890,2057,898],{},[903,2059,2060,2070,2080,2092,2104,2116,2128,2140,2152,2164,2176],{},[887,2061,2062,2066],{},[908,2063,2064],{},[329,2065,476],{},[908,2067,2068],{},[329,2069,401],{},[887,2071,2072,2076],{},[908,2073,2074],{},[329,2075,1127],{},[908,2077,2078],{},[329,2079,404],{},[887,2081,2082,2087],{},[908,2083,2084],{},[329,2085,2086],{},"Integer",[908,2088,2089],{},[329,2090,2091],{},"Serdes.Integer()",[887,2093,2094,2099],{},[908,2095,2096],{},[329,2097,2098],{},"Short",[908,2100,2101],{},[329,2102,2103],{},"Serdes.Short()",[887,2105,2106,2111],{},[908,2107,2108],{},[329,2109,2110],{},"Float",[908,2112,2113],{},[329,2114,2115],{},"Serdes.Float()",[887,2117,2118,2123],{},[908,2119,2120],{},[329,2121,2122],{},"Double",[908,2124,2125],{},[329,2126,2127],{},"Serdes.Double()",[887,2129,2130,2135],{},[908,2131,2132],{},[329,2133,2134],{},"byte[]",[908,2136,2137],{},[329,2138,2139],{},"Serdes.ByteArray()",[887,2141,2142,2147],{},[908,2143,2144],{},[329,2145,2146],{},"ByteBuffer",[908,2148,2149],{},[329,2150,2151],{},"Serdes.ByteBuffer()",[887,2153,2154,2159],{},[908,2155,2156],{},[329,2157,2158],{},"Bytes",[908,2160,2161],{},[329,2162,2163],{},"Serdes.Bytes()",[887,2165,2166,2171],{},[908,2167,2168],{},[329,2169,2170],{},"UUID",[908,2172,2173],{},[329,2174,2175],{},"Serdes.UUID()",[887,2177,2178,2183],{},[908,2179,2180],{},[329,2181,2182],{},"Void",[908,2184,2185],{},[329,2186,2187],{},"Serdes.Void()",[320,2189,2190,2191,2194,2195,388],{},"These are plain Kafka client types — the same ones you'd reach for in a Kafka Streams app. The full list is whatever your ",[329,2192,2193],{},"kafka-clients"," version exposes on ",[329,2196,697],{},[436,2198,2200],{"id":2199},"custom-serdes","Custom serdes",[320,2202,2203,2204,2206,2207,356,2210,2213,2214,388],{},"For your own value types — JSON, Protobuf, a hand-rolled binary format — implement ",[329,2205,331],{},", or build one from a ",[329,2208,2209],{},"Serializer\u003CT>",[329,2211,2212],{},"Deserializer\u003CT>"," pair with ",[329,2215,2216],{},"Serdes.serdeFrom(serializer, deserializer)",[320,2218,2219],{},"A serde is just a serializer and a deserializer bundled together:",[489,2221,2222,2545],{"group":491},[493,2223,2225],{"className":495,"code":2224,"filename":497,"language":498,"meta":499,"style":499},"import com.fasterxml.jackson.databind.ObjectMapper\nimport org.apache.kafka.common.serialization.Deserializer\nimport org.apache.kafka.common.serialization.Serde\nimport org.apache.kafka.common.serialization.Serdes\nimport org.apache.kafka.common.serialization.Serializer\n\ndata class Order(val id: String, val amount: Double)\n\nclass JsonOrderSerializer : Serializer\u003COrder> {\n    private val mapper = ObjectMapper()\n    override fun serialize(topic: String?, data: Order?): ByteArray? =\n        data?.let { mapper.writeValueAsBytes(it) }\n}\n\nclass JsonOrderDeserializer : Deserializer\u003COrder> {\n    private val mapper = ObjectMapper()\n    override fun deserialize(topic: String?, data: ByteArray?): Order? =\n        data?.let { mapper.readValue(it, Order::class.java) }\n}\n\nval orderSerde: Serde\u003COrder> =\n    Serdes.serdeFrom(JsonOrderSerializer(), JsonOrderDeserializer())\n",[329,2226,2227,2234,2241,2248,2254,2261,2265,2296,2300,2322,2341,2379,2399,2404,2408,2426,2441,2471,2493,2498,2503,2523],{"__ignoreMap":499},[503,2228,2229,2231],{"class":505,"line":506},[503,2230,510],{"class":509},[503,2232,2233],{"class":513}," com.fasterxml.jackson.databind.ObjectMapper\n",[503,2235,2236,2238],{"class":505,"line":517},[503,2237,510],{"class":509},[503,2239,2240],{"class":513}," org.apache.kafka.common.serialization.Deserializer\n",[503,2242,2243,2245],{"class":505,"line":525},[503,2244,510],{"class":509},[503,2246,2247],{"class":513}," org.apache.kafka.common.serialization.Serde\n",[503,2249,2250,2252],{"class":505,"line":532},[503,2251,510],{"class":509},[503,2253,522],{"class":513},[503,2255,2256,2258],{"class":505,"line":555},[503,2257,510],{"class":509},[503,2259,2260],{"class":513}," org.apache.kafka.common.serialization.Serializer\n",[503,2262,2263],{"class":505,"line":572},[503,2264,529],{"emptyLinePlaceholder":528},[503,2266,2267,2270,2273,2276,2278,2280,2283,2285,2287,2289,2292,2294],{"class":505,"line":583},[503,2268,2269],{"class":708},"data",[503,2271,2272],{"class":509}," class",[503,2274,2275],{"class":1482}," Order",[503,2277,756],{"class":538},[503,2279,535],{"class":509},[503,2281,2282],{"class":538}," id: ",[503,2284,476],{"class":1482},[503,2286,370],{"class":538},[503,2288,535],{"class":509},[503,2290,2291],{"class":538}," amount: ",[503,2293,2122],{"class":1482},[503,2295,632],{"class":538},[503,2297,2298],{"class":505,"line":591},[503,2299,529],{"emptyLinePlaceholder":528},[503,2301,2302,2305,2308,2311,2314,2316,2319],{"class":505,"line":605},[503,2303,2304],{"class":509},"class",[503,2306,2307],{"class":1482}," JsonOrderSerializer",[503,2309,2310],{"class":538}," : ",[503,2312,2313],{"class":1482},"Serializer",[503,2315,1306],{"class":538},[503,2317,2318],{"class":1482},"Order",[503,2320,2321],{"class":538},"> {\n",[503,2323,2324,2327,2330,2333,2335,2338],{"class":505,"line":617},[503,2325,2326],{"class":708},"    private",[503,2328,2329],{"class":509}," val",[503,2331,2332],{"class":538}," mapper ",[503,2334,543],{"class":542},[503,2336,2337],{"class":513}," ObjectMapper",[503,2339,2340],{"class":538},"()\n",[503,2342,2343,2346,2349,2352,2355,2357,2360,2362,2365,2367,2370,2373,2376],{"class":505,"line":623},[503,2344,2345],{"class":708},"    override",[503,2347,2348],{"class":509}," fun",[503,2350,2351],{"class":513}," serialize",[503,2353,2354],{"class":538},"(topic: ",[503,2356,476],{"class":1482},[503,2358,2359],{"class":538},"?, ",[503,2361,2269],{"class":708},[503,2363,2364],{"class":538},": ",[503,2366,2318],{"class":1482},[503,2368,2369],{"class":538},"?): ",[503,2371,2372],{"class":1482},"ByteArray",[503,2374,2375],{"class":538},"? ",[503,2377,2378],{"class":542},"=\n",[503,2380,2381,2384,2387,2390,2393,2396],{"class":505,"line":629},[503,2382,2383],{"class":708},"        data",[503,2385,2386],{"class":538},"?.",[503,2388,2389],{"class":513},"let",[503,2391,2392],{"class":538}," { mapper.",[503,2394,2395],{"class":513},"writeValueAsBytes",[503,2397,2398],{"class":538},"(it) }\n",[503,2400,2401],{"class":505,"line":1155},[503,2402,2403],{"class":538},"}\n",[503,2405,2406],{"class":505,"line":1163},[503,2407,529],{"emptyLinePlaceholder":528},[503,2409,2410,2412,2415,2417,2420,2422,2424],{"class":505,"line":1181},[503,2411,2304],{"class":509},[503,2413,2414],{"class":1482}," JsonOrderDeserializer",[503,2416,2310],{"class":538},[503,2418,2419],{"class":1482},"Deserializer",[503,2421,1306],{"class":538},[503,2423,2318],{"class":1482},[503,2425,2321],{"class":538},[503,2427,2429,2431,2433,2435,2437,2439],{"class":505,"line":2428},16,[503,2430,2326],{"class":708},[503,2432,2329],{"class":509},[503,2434,2332],{"class":538},[503,2436,543],{"class":542},[503,2438,2337],{"class":513},[503,2440,2340],{"class":538},[503,2442,2444,2446,2448,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469],{"class":505,"line":2443},17,[503,2445,2345],{"class":708},[503,2447,2348],{"class":509},[503,2449,2450],{"class":513}," deserialize",[503,2452,2354],{"class":538},[503,2454,476],{"class":1482},[503,2456,2359],{"class":538},[503,2458,2269],{"class":708},[503,2460,2364],{"class":538},[503,2462,2372],{"class":1482},[503,2464,2369],{"class":538},[503,2466,2318],{"class":1482},[503,2468,2375],{"class":538},[503,2470,2378],{"class":542},[503,2472,2474,2476,2478,2480,2482,2485,2488,2490],{"class":505,"line":2473},18,[503,2475,2383],{"class":708},[503,2477,2386],{"class":538},[503,2479,2389],{"class":513},[503,2481,2392],{"class":538},[503,2483,2484],{"class":513},"readValue",[503,2486,2487],{"class":538},"(it, Order::",[503,2489,2304],{"class":513},[503,2491,2492],{"class":538},".java) }\n",[503,2494,2496],{"class":505,"line":2495},19,[503,2497,2403],{"class":538},[503,2499,2501],{"class":505,"line":2500},20,[503,2502,529],{"emptyLinePlaceholder":528},[503,2504,2506,2508,2511,2514,2516,2518,2521],{"class":505,"line":2505},21,[503,2507,535],{"class":509},[503,2509,2510],{"class":538}," orderSerde: ",[503,2512,2513],{"class":1482},"Serde",[503,2515,1306],{"class":538},[503,2517,2318],{"class":1482},[503,2519,2520],{"class":538},"> ",[503,2522,2378],{"class":542},[503,2524,2526,2529,2532,2534,2537,2540,2543],{"class":505,"line":2525},22,[503,2527,2528],{"class":538},"    Serdes.",[503,2530,2531],{"class":513},"serdeFrom",[503,2533,756],{"class":538},[503,2535,2536],{"class":513},"JsonOrderSerializer",[503,2538,2539],{"class":538},"(), ",[503,2541,2542],{"class":513},"JsonOrderDeserializer",[503,2544,602],{"class":538},[493,2546,2548],{"className":635,"code":2547,"filename":637,"language":638,"meta":499,"style":499},"import com.fasterxml.jackson.databind.ObjectMapper;\nimport org.apache.kafka.common.serialization.Deserializer;\nimport org.apache.kafka.common.serialization.Serde;\nimport org.apache.kafka.common.serialization.Serdes;\nimport org.apache.kafka.common.serialization.Serializer;\n\nrecord Order(String id, double amount) {}\n\nclass JsonOrderSerializer implements Serializer\u003COrder> {\n    private final ObjectMapper mapper = new ObjectMapper();\n    @Override\n    public byte[] serialize(String topic, Order data) {\n        if (data == null) return null;\n        try {\n            return mapper.writeValueAsBytes(data);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n}\n\nclass JsonOrderDeserializer implements Deserializer\u003COrder> {\n    private final ObjectMapper mapper = new ObjectMapper();\n    @Override\n    public Order deserialize(String topic, byte[] data) {\n        if (data == null) return null;\n        try {\n            return mapper.readValue(data, Order.class);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n}\n\nSerde\u003COrder> orderSerde =\n    Serdes.serdeFrom(new JsonOrderSerializer(), new JsonOrderDeserializer());\n",[329,2549,2550,2579,2607,2635,2663,2691,2695,2720,2724,2744,2766,2774,2806,2831,2838,2855,2875,2891,2895,2900,2904,2908,2927,2946,2953,2982,3003,3010,3035,3052,3067,3072,3077,3082,3087,3104],{"__ignoreMap":499},[503,2551,2552,2554,2557,2559,2562,2564,2567,2569,2572,2574,2577],{"class":505,"line":506},[503,2553,510],{"class":509},[503,2555,2556],{"class":538}," com",[503,2558,388],{"class":542},[503,2560,2561],{"class":538},"fasterxml",[503,2563,388],{"class":542},[503,2565,2566],{"class":538},"jackson",[503,2568,388],{"class":542},[503,2570,2571],{"class":538},"databind",[503,2573,388],{"class":542},[503,2575,2576],{"class":538},"ObjectMapper",[503,2578,665],{"class":542},[503,2580,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605],{"class":505,"line":517},[503,2582,510],{"class":509},[503,2584,672],{"class":538},[503,2586,388],{"class":542},[503,2588,677],{"class":538},[503,2590,388],{"class":542},[503,2592,682],{"class":538},[503,2594,388],{"class":542},[503,2596,687],{"class":538},[503,2598,388],{"class":542},[503,2600,692],{"class":538},[503,2602,388],{"class":542},[503,2604,2419],{"class":538},[503,2606,665],{"class":542},[503,2608,2609,2611,2613,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633],{"class":505,"line":525},[503,2610,510],{"class":509},[503,2612,672],{"class":538},[503,2614,388],{"class":542},[503,2616,677],{"class":538},[503,2618,388],{"class":542},[503,2620,682],{"class":538},[503,2622,388],{"class":542},[503,2624,687],{"class":538},[503,2626,388],{"class":542},[503,2628,692],{"class":538},[503,2630,388],{"class":542},[503,2632,2513],{"class":538},[503,2634,665],{"class":542},[503,2636,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661],{"class":505,"line":532},[503,2638,510],{"class":509},[503,2640,672],{"class":538},[503,2642,388],{"class":542},[503,2644,677],{"class":538},[503,2646,388],{"class":542},[503,2648,682],{"class":538},[503,2650,388],{"class":542},[503,2652,687],{"class":538},[503,2654,388],{"class":542},[503,2656,692],{"class":538},[503,2658,388],{"class":542},[503,2660,697],{"class":538},[503,2662,665],{"class":542},[503,2664,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689],{"class":505,"line":555},[503,2666,510],{"class":509},[503,2668,672],{"class":538},[503,2670,388],{"class":542},[503,2672,677],{"class":538},[503,2674,388],{"class":542},[503,2676,682],{"class":538},[503,2678,388],{"class":542},[503,2680,687],{"class":538},[503,2682,388],{"class":542},[503,2684,692],{"class":538},[503,2686,388],{"class":542},[503,2688,2313],{"class":538},[503,2690,665],{"class":542},[503,2692,2693],{"class":505,"line":572},[503,2694,529],{"emptyLinePlaceholder":528},[503,2696,2697,2700,2702,2704,2707,2709,2712,2715,2717],{"class":505,"line":583},[503,2698,2699],{"class":708},"record",[503,2701,2275],{"class":1482},[503,2703,756],{"class":542},[503,2705,2706],{"class":538},"String id",[503,2708,1311],{"class":542},[503,2710,2711],{"class":708}," double",[503,2713,2714],{"class":538}," amount",[503,2716,1917],{"class":542},[503,2718,2719],{"class":542}," {}\n",[503,2721,2722],{"class":505,"line":591},[503,2723,529],{"emptyLinePlaceholder":528},[503,2725,2726,2728,2730,2733,2736,2738,2740,2742],{"class":505,"line":605},[503,2727,2304],{"class":708},[503,2729,2307],{"class":1482},[503,2731,2732],{"class":708}," implements",[503,2734,2735],{"class":513}," Serializer",[503,2737,1306],{"class":542},[503,2739,2318],{"class":708},[503,2741,1317],{"class":542},[503,2743,580],{"class":542},[503,2745,2746,2748,2751,2753,2756,2758,2761,2763],{"class":505,"line":617},[503,2747,2326],{"class":708},[503,2749,2750],{"class":708}," final",[503,2752,2337],{"class":538},[503,2754,2755],{"class":712}," mapper",[503,2757,716],{"class":542},[503,2759,2760],{"class":509}," new",[503,2762,2337],{"class":513},[503,2764,2765],{"class":542},"();\n",[503,2767,2768,2771],{"class":505,"line":623},[503,2769,2770],{"class":542},"    @",[503,2772,2773],{"class":708},"Override\n",[503,2775,2776,2779,2782,2785,2787,2789,2792,2795,2797,2800,2802,2804],{"class":505,"line":629},[503,2777,2778],{"class":708},"    public",[503,2780,2781],{"class":708}," byte",[503,2783,2784],{"class":542},"[]",[503,2786,2351],{"class":513},[503,2788,756],{"class":542},[503,2790,2791],{"class":538},"String ",[503,2793,2794],{"class":712},"topic",[503,2796,1311],{"class":542},[503,2798,2799],{"class":538}," Order ",[503,2801,2269],{"class":712},[503,2803,1917],{"class":542},[503,2805,580],{"class":542},[503,2807,2808,2811,2813,2816,2819,2822,2824,2827,2829],{"class":505,"line":1155},[503,2809,2810],{"class":509},"        if",[503,2812,398],{"class":542},[503,2814,2815],{"class":538},"data ",[503,2817,2818],{"class":708},"==",[503,2820,2821],{"class":509}," null",[503,2823,1917],{"class":542},[503,2825,2826],{"class":509}," return",[503,2828,2821],{"class":509},[503,2830,665],{"class":542},[503,2832,2833,2836],{"class":505,"line":1163},[503,2834,2835],{"class":509},"        try",[503,2837,580],{"class":542},[503,2839,2840,2843,2845,2847,2849,2851,2853],{"class":505,"line":1181},[503,2841,2842],{"class":509},"            return",[503,2844,2755],{"class":712},[503,2846,388],{"class":542},[503,2848,2395],{"class":513},[503,2850,756],{"class":542},[503,2852,2269],{"class":538},[503,2854,813],{"class":542},[503,2856,2857,2860,2863,2865,2868,2871,2873],{"class":505,"line":2428},[503,2858,2859],{"class":542},"        }",[503,2861,2862],{"class":509}," catch",[503,2864,398],{"class":542},[503,2866,2867],{"class":538},"Exception ",[503,2869,2870],{"class":712},"e",[503,2872,1917],{"class":542},[503,2874,580],{"class":542},[503,2876,2877,2880,2882,2885,2887,2889],{"class":505,"line":2443},[503,2878,2879],{"class":509},"            throw",[503,2881,2760],{"class":509},[503,2883,2884],{"class":513}," RuntimeException",[503,2886,756],{"class":542},[503,2888,2870],{"class":538},[503,2890,813],{"class":542},[503,2892,2893],{"class":505,"line":2473},[503,2894,620],{"class":542},[503,2896,2897],{"class":505,"line":2495},[503,2898,2899],{"class":542},"    }\n",[503,2901,2902],{"class":505,"line":2500},[503,2903,2403],{"class":542},[503,2905,2906],{"class":505,"line":2505},[503,2907,529],{"emptyLinePlaceholder":528},[503,2909,2910,2912,2914,2916,2919,2921,2923,2925],{"class":505,"line":2525},[503,2911,2304],{"class":708},[503,2913,2414],{"class":1482},[503,2915,2732],{"class":708},[503,2917,2918],{"class":513}," Deserializer",[503,2920,1306],{"class":542},[503,2922,2318],{"class":708},[503,2924,1317],{"class":542},[503,2926,580],{"class":542},[503,2928,2930,2932,2934,2936,2938,2940,2942,2944],{"class":505,"line":2929},23,[503,2931,2326],{"class":708},[503,2933,2750],{"class":708},[503,2935,2337],{"class":538},[503,2937,2755],{"class":712},[503,2939,716],{"class":542},[503,2941,2760],{"class":509},[503,2943,2337],{"class":513},[503,2945,2765],{"class":542},[503,2947,2949,2951],{"class":505,"line":2948},24,[503,2950,2770],{"class":542},[503,2952,2773],{"class":708},[503,2954,2956,2958,2960,2963,2965,2967,2969,2971,2973,2975,2978,2980],{"class":505,"line":2955},25,[503,2957,2778],{"class":708},[503,2959,2799],{"class":538},[503,2961,2962],{"class":513},"deserialize",[503,2964,756],{"class":542},[503,2966,2791],{"class":538},[503,2968,2794],{"class":712},[503,2970,1311],{"class":542},[503,2972,2781],{"class":708},[503,2974,2784],{"class":542},[503,2976,2977],{"class":712}," data",[503,2979,1917],{"class":542},[503,2981,580],{"class":542},[503,2983,2985,2987,2989,2991,2993,2995,2997,2999,3001],{"class":505,"line":2984},26,[503,2986,2810],{"class":509},[503,2988,398],{"class":542},[503,2990,2815],{"class":538},[503,2992,2818],{"class":708},[503,2994,2821],{"class":509},[503,2996,1917],{"class":542},[503,2998,2826],{"class":509},[503,3000,2821],{"class":509},[503,3002,665],{"class":542},[503,3004,3006,3008],{"class":505,"line":3005},27,[503,3007,2835],{"class":509},[503,3009,580],{"class":542},[503,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033],{"class":505,"line":3012},28,[503,3014,2842],{"class":509},[503,3016,2755],{"class":712},[503,3018,388],{"class":542},[503,3020,2484],{"class":513},[503,3022,756],{"class":542},[503,3024,2269],{"class":538},[503,3026,1311],{"class":542},[503,3028,2275],{"class":712},[503,3030,388],{"class":542},[503,3032,2304],{"class":712},[503,3034,813],{"class":542},[503,3036,3038,3040,3042,3044,3046,3048,3050],{"class":505,"line":3037},29,[503,3039,2859],{"class":542},[503,3041,2862],{"class":509},[503,3043,398],{"class":542},[503,3045,2867],{"class":538},[503,3047,2870],{"class":712},[503,3049,1917],{"class":542},[503,3051,580],{"class":542},[503,3053,3055,3057,3059,3061,3063,3065],{"class":505,"line":3054},30,[503,3056,2879],{"class":509},[503,3058,2760],{"class":509},[503,3060,2884],{"class":513},[503,3062,756],{"class":542},[503,3064,2870],{"class":538},[503,3066,813],{"class":542},[503,3068,3070],{"class":505,"line":3069},31,[503,3071,620],{"class":542},[503,3073,3075],{"class":505,"line":3074},32,[503,3076,2899],{"class":542},[503,3078,3080],{"class":505,"line":3079},33,[503,3081,2403],{"class":542},[503,3083,3085],{"class":505,"line":3084},34,[503,3086,529],{"emptyLinePlaceholder":528},[503,3088,3090,3092,3094,3096,3098,3101],{"class":505,"line":3089},35,[503,3091,2513],{"class":538},[503,3093,1306],{"class":542},[503,3095,2318],{"class":708},[503,3097,1317],{"class":542},[503,3099,3100],{"class":712}," orderSerde",[503,3102,3103],{"class":542}," =\n",[503,3105,3107,3110,3112,3114,3116,3119,3121,3123,3125,3127],{"class":505,"line":3106},36,[503,3108,3109],{"class":712},"    Serdes",[503,3111,388],{"class":542},[503,3113,2531],{"class":513},[503,3115,756],{"class":542},[503,3117,3118],{"class":509},"new",[503,3120,2307],{"class":513},[503,3122,1364],{"class":542},[503,3124,2760],{"class":509},[503,3126,2414],{"class":513},[503,3128,784],{"class":542},[320,3130,3131,3132,3135,3136,370,3139,370,3142,3145],{},"Use ",[329,3133,3134],{},"orderSerde"," exactly like a built-in — pass it to ",[329,3137,3138],{},"Consumed.with(...)",[329,3140,3141],{},"Produced.with(...)",[329,3143,3144],{},"Materialized.withValueSerde(...)",", or set it as the default value serde.",[855,3147,3149],{"color":3148,"icon":80},"warning",[320,3150,3151,3152,3154,3155,3157,3158,3160,3161,3163,3164,3166],{},"A serde must round-trip a ",[329,3153,469],{}," cleanly — return ",[329,3156,469],{}," for ",[329,3159,469],{}," input. KTable changelogs and tombstones rely on ",[329,3162,469],{}," values to signal deletion, so a serde that throws on ",[329,3165,469],{}," will break stateful operators.",[436,3168,410],{"id":3169},"windowed-keys",[320,3171,3172,3173,3176,3177,3180,3181,3184,3185,3188],{},"Windowed aggregations (",[329,3174,3175],{},"windowedBy(...).count()",", session windows, sliding windows) produce keys of type ",[329,3178,3179],{},"Windowed\u003CK>"," — the original key plus the window's start and end. To ",[324,3182,3183],{},"write those keys to a topic"," (or read them back), you need a serde that encodes the window bounds alongside the key bytes. ",[329,3186,3187],{},"WindowedSerdes"," builds those for you from the inner key serde.",[320,3190,3191,3192,3195,3196,3198,3199,3202,3203,3205,3206,3209,3210,398,3212,3214,3215,843],{},"The ",[324,3193,3194],{},"state store"," doesn't need one: windowed ",[329,3197,380],{}," takes the ",[324,3200,3201],{},"plain"," key serde (",[329,3204,401],{},") — StoatFlow wraps it into a ",[329,3207,3208],{},"Serde\u003CWindowed\u003CK>>"," internally, exactly like Kafka Streams. So the windowed serde belongs on the ",[324,3211,1400],{},[329,3213,373],{},"), not the ",[329,3216,380],{},[489,3218,3219,3410],{"group":491},[493,3220,3222],{"className":495,"code":3221,"filename":497,"language":498,"meta":499,"style":499},"import io.stoatflow.core.state.StateStore\nimport io.stoatflow.core.topology.Materialized\nimport io.stoatflow.core.topology.Produced\nimport io.stoatflow.core.topology.WindowedSerdes\nimport org.apache.kafka.common.serialization.Serdes\n\n\u002F\u002F Encodes Windowed\u003CString> keys for a topic — used on the output, not the store.\nval windowedKeySerde = WindowedSerdes.timeWindowedSerdeFrom(Serdes.String())\n\nstream\n    .groupByKey()\n    .windowedBy(\u002F* window definition *\u002F)\n    .count(\n        \u002F\u002F Plain key serde — StoatFlow wraps it into Serde\u003CWindowed\u003CString>> for the result table.\n        Materialized.`as`\u003CString, Long, StateStore>(\"windowed-counts\")\n            .withKeySerde(Serdes.String())\n            .withValueSerde(Serdes.Long()),\n    ).toStream()\n    .to(\"windowed-counts\", Produced.with(windowedKeySerde, Serdes.Long()))\n",[329,3223,3224,3230,3236,3242,3249,3255,3259,3264,3285,3289,3293,3301,3315,3323,3328,3353,3365,3377,3387],{"__ignoreMap":499},[503,3225,3226,3228],{"class":505,"line":506},[503,3227,510],{"class":509},[503,3229,1642],{"class":513},[503,3231,3232,3234],{"class":505,"line":517},[503,3233,510],{"class":509},[503,3235,1656],{"class":513},[503,3237,3238,3240],{"class":505,"line":525},[503,3239,510],{"class":509},[503,3241,1071],{"class":513},[503,3243,3244,3246],{"class":505,"line":532},[503,3245,510],{"class":509},[503,3247,3248],{"class":513}," io.stoatflow.core.topology.WindowedSerdes\n",[503,3250,3251,3253],{"class":505,"line":555},[503,3252,510],{"class":509},[503,3254,522],{"class":513},[503,3256,3257],{"class":505,"line":572},[503,3258,529],{"emptyLinePlaceholder":528},[503,3260,3261],{"class":505,"line":583},[503,3262,3263],{"class":852},"\u002F\u002F Encodes Windowed\u003CString> keys for a topic — used on the output, not the store.\n",[503,3265,3266,3268,3271,3273,3276,3279,3281,3283],{"class":505,"line":591},[503,3267,535],{"class":509},[503,3269,3270],{"class":538}," windowedKeySerde ",[503,3272,543],{"class":542},[503,3274,3275],{"class":538}," WindowedSerdes.",[503,3277,3278],{"class":513},"timeWindowedSerdeFrom",[503,3280,597],{"class":538},[503,3282,476],{"class":513},[503,3284,602],{"class":538},[503,3286,3287],{"class":505,"line":605},[503,3288,529],{"emptyLinePlaceholder":528},[503,3290,3291],{"class":505,"line":617},[503,3292,1671],{"class":538},[503,3294,3295,3297,3299],{"class":505,"line":623},[503,3296,1676],{"class":538},[503,3298,993],{"class":513},[503,3300,2340],{"class":538},[503,3302,3303,3305,3308,3310,3313],{"class":505,"line":629},[503,3304,1676],{"class":538},[503,3306,3307],{"class":513},"windowedBy",[503,3309,756],{"class":538},[503,3311,3312],{"class":852},"\u002F* window definition *\u002F",[503,3314,632],{"class":538},[503,3316,3317,3319,3321],{"class":505,"line":1155},[503,3318,1676],{"class":538},[503,3320,1019],{"class":513},[503,3322,552],{"class":538},[503,3324,3325],{"class":505,"line":1163},[503,3326,3327],{"class":852},"        \u002F\u002F Plain key serde — StoatFlow wraps it into Serde\u003CWindowed\u003CString>> for the result table.\n",[503,3329,3330,3332,3334,3336,3338,3340,3342,3344,3346,3348,3351],{"class":505,"line":1181},[503,3331,1729],{"class":538},[503,3333,1477],{"class":513},[503,3335,1306],{"class":538},[503,3337,476],{"class":1482},[503,3339,370],{"class":538},[503,3341,1127],{"class":1482},[503,3343,370],{"class":538},[503,3345,1744],{"class":1482},[503,3347,1489],{"class":538},[503,3349,3350],{"class":846},"\"windowed-counts\"",[503,3352,632],{"class":538},[503,3354,3355,3357,3359,3361,3363],{"class":505,"line":2428},[503,3356,1756],{"class":538},[503,3358,1502],{"class":513},[503,3360,597],{"class":538},[503,3362,476],{"class":513},[503,3364,602],{"class":538},[503,3366,3367,3369,3371,3373,3375],{"class":505,"line":2443},[503,3368,1756],{"class":538},[503,3370,1515],{"class":513},[503,3372,597],{"class":538},[503,3374,1127],{"class":513},[503,3376,1130],{"class":538},[503,3378,3379,3382,3385],{"class":505,"line":2473},[503,3380,3381],{"class":538},"    ).",[503,3383,3384],{"class":513},"toStream",[503,3386,2340],{"class":538},[503,3388,3389,3391,3393,3395,3397,3400,3402,3405,3407],{"class":505,"line":2495},[503,3390,1676],{"class":538},[503,3392,947],{"class":513},[503,3394,756],{"class":538},[503,3396,3350],{"class":846},[503,3398,3399],{"class":538},", Produced.",[503,3401,1117],{"class":513},[503,3403,3404],{"class":538},"(windowedKeySerde, Serdes.",[503,3406,1127],{"class":513},[503,3408,3409],{"class":538},"()))\n",[493,3411,3413],{"className":635,"code":3412,"filename":637,"language":638,"meta":499,"style":499},"import io.stoatflow.core.state.StateStore;\nimport io.stoatflow.core.topology.Materialized;\nimport io.stoatflow.core.topology.Produced;\nimport io.stoatflow.core.topology.WindowedSerdes;\nimport io.stoatflow.core.topology.Windowed;\nimport org.apache.kafka.common.serialization.Serde;\nimport org.apache.kafka.common.serialization.Serdes;\n\n\u002F\u002F Encodes Windowed\u003CString> keys for a topic — used on the output, not the store.\nSerde\u003CWindowed\u003CString>> windowedKeySerde =\n    WindowedSerdes.timeWindowedSerdeFrom(Serdes.String());\n\nstream\n    .groupByKey()\n    .windowedBy(\u002F* window definition *\u002F)\n    .count(\n        \u002F\u002F Plain key serde — StoatFlow wraps it into Serde\u003CWindowed\u003CString>> for the result table.\n        Materialized.\u003CString, Long, StateStore>as(\"windowed-counts\")\n            .withKeySerde(Serdes.String())\n            .withValueSerde(Serdes.Long()))\n    .toStream()\n    .to(\"windowed-counts\", Produced.with(windowedKeySerde, Serdes.Long()));\n",[329,3414,3415,3439,3463,3487,3511,3536,3564,3592,3596,3600,3620,3639,3643,3647,3655,3667,3675,3679,3712,3728,3744,3752],{"__ignoreMap":499},[503,3416,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435,3437],{"class":505,"line":506},[503,3418,510],{"class":509},[503,3420,647],{"class":538},[503,3422,388],{"class":542},[503,3424,652],{"class":538},[503,3426,388],{"class":542},[503,3428,1203],{"class":538},[503,3430,388],{"class":542},[503,3432,1804],{"class":538},[503,3434,388],{"class":542},[503,3436,1744],{"class":538},[503,3438,665],{"class":542},[503,3440,3441,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461],{"class":505,"line":517},[503,3442,510],{"class":509},[503,3444,647],{"class":538},[503,3446,388],{"class":542},[503,3448,652],{"class":538},[503,3450,388],{"class":542},[503,3452,1203],{"class":538},[503,3454,388],{"class":542},[503,3456,1208],{"class":538},[503,3458,388],{"class":542},[503,3460,380],{"class":538},[503,3462,665],{"class":542},[503,3464,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485],{"class":505,"line":525},[503,3466,510],{"class":509},[503,3468,647],{"class":538},[503,3470,388],{"class":542},[503,3472,652],{"class":538},[503,3474,388],{"class":542},[503,3476,1203],{"class":538},[503,3478,388],{"class":542},[503,3480,1208],{"class":538},[503,3482,388],{"class":542},[503,3484,373],{"class":538},[503,3486,665],{"class":542},[503,3488,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507,3509],{"class":505,"line":532},[503,3490,510],{"class":509},[503,3492,647],{"class":538},[503,3494,388],{"class":542},[503,3496,652],{"class":538},[503,3498,388],{"class":542},[503,3500,1203],{"class":538},[503,3502,388],{"class":542},[503,3504,1208],{"class":538},[503,3506,388],{"class":542},[503,3508,3187],{"class":538},[503,3510,665],{"class":542},[503,3512,3513,3515,3517,3519,3521,3523,3525,3527,3529,3531,3534],{"class":505,"line":555},[503,3514,510],{"class":509},[503,3516,647],{"class":538},[503,3518,388],{"class":542},[503,3520,652],{"class":538},[503,3522,388],{"class":542},[503,3524,1203],{"class":538},[503,3526,388],{"class":542},[503,3528,1208],{"class":538},[503,3530,388],{"class":542},[503,3532,3533],{"class":538},"Windowed",[503,3535,665],{"class":542},[503,3537,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562],{"class":505,"line":572},[503,3539,510],{"class":509},[503,3541,672],{"class":538},[503,3543,388],{"class":542},[503,3545,677],{"class":538},[503,3547,388],{"class":542},[503,3549,682],{"class":538},[503,3551,388],{"class":542},[503,3553,687],{"class":538},[503,3555,388],{"class":542},[503,3557,692],{"class":538},[503,3559,388],{"class":542},[503,3561,2513],{"class":538},[503,3563,665],{"class":542},[503,3565,3566,3568,3570,3572,3574,3576,3578,3580,3582,3584,3586,3588,3590],{"class":505,"line":583},[503,3567,510],{"class":509},[503,3569,672],{"class":538},[503,3571,388],{"class":542},[503,3573,677],{"class":538},[503,3575,388],{"class":542},[503,3577,682],{"class":538},[503,3579,388],{"class":542},[503,3581,687],{"class":538},[503,3583,388],{"class":542},[503,3585,692],{"class":538},[503,3587,388],{"class":542},[503,3589,697],{"class":538},[503,3591,665],{"class":542},[503,3593,3594],{"class":505,"line":591},[503,3595,529],{"emptyLinePlaceholder":528},[503,3597,3598],{"class":505,"line":605},[503,3599,3263],{"class":852},[503,3601,3602,3604,3606,3608,3610,3612,3615,3618],{"class":505,"line":617},[503,3603,2513],{"class":538},[503,3605,1306],{"class":542},[503,3607,3533],{"class":538},[503,3609,1306],{"class":542},[503,3611,476],{"class":708},[503,3613,3614],{"class":542},">>",[503,3616,3617],{"class":712}," windowedKeySerde",[503,3619,3103],{"class":542},[503,3621,3622,3625,3627,3629,3631,3633,3635,3637],{"class":505,"line":623},[503,3623,3624],{"class":712},"    WindowedSerdes",[503,3626,388],{"class":542},[503,3628,3278],{"class":513},[503,3630,756],{"class":542},[503,3632,697],{"class":712},[503,3634,388],{"class":542},[503,3636,476],{"class":513},[503,3638,784],{"class":542},[503,3640,3641],{"class":505,"line":629},[503,3642,529],{"emptyLinePlaceholder":528},[503,3644,3645],{"class":505,"line":1155},[503,3646,1671],{"class":538},[503,3648,3649,3651,3653],{"class":505,"line":1163},[503,3650,1676],{"class":542},[503,3652,993],{"class":513},[503,3654,2340],{"class":542},[503,3656,3657,3659,3661,3663,3665],{"class":505,"line":1181},[503,3658,1676],{"class":542},[503,3660,3307],{"class":513},[503,3662,756],{"class":542},[503,3664,3312],{"class":852},[503,3666,632],{"class":542},[503,3668,3669,3671,3673],{"class":505,"line":2428},[503,3670,1676],{"class":542},[503,3672,1019],{"class":513},[503,3674,552],{"class":542},[503,3676,3677],{"class":505,"line":2443},[503,3678,3327],{"class":852},[503,3680,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3708,3710],{"class":505,"line":2473},[503,3682,1967],{"class":538},[503,3684,388],{"class":542},[503,3686,1306],{"class":708},[503,3688,476],{"class":538},[503,3690,1311],{"class":542},[503,3692,1314],{"class":538},[503,3694,1311],{"class":542},[503,3696,1982],{"class":538},[503,3698,1317],{"class":708},[503,3700,1568],{"class":513},[503,3702,756],{"class":542},[503,3704,1342],{"class":1335},[503,3706,3707],{"class":846},"windowed-counts",[503,3709,1342],{"class":1335},[503,3711,632],{"class":542},[503,3713,3714,3716,3718,3720,3722,3724,3726],{"class":505,"line":2495},[503,3715,1756],{"class":542},[503,3717,1502],{"class":513},[503,3719,756],{"class":542},[503,3721,697],{"class":712},[503,3723,388],{"class":542},[503,3725,476],{"class":513},[503,3727,602],{"class":542},[503,3729,3730,3732,3734,3736,3738,3740,3742],{"class":505,"line":2500},[503,3731,1756],{"class":542},[503,3733,1515],{"class":513},[503,3735,756],{"class":542},[503,3737,697],{"class":712},[503,3739,388],{"class":542},[503,3741,1127],{"class":513},[503,3743,3409],{"class":542},[503,3745,3746,3748,3750],{"class":505,"line":2505},[503,3747,1676],{"class":542},[503,3749,3384],{"class":513},[503,3751,2340],{"class":542},[503,3753,3754,3756,3758,3760,3762,3764,3766,3768,3771,3773,3775,3777,3780,3782,3784,3786,3788],{"class":505,"line":2525},[503,3755,1676],{"class":542},[503,3757,947],{"class":513},[503,3759,756],{"class":542},[503,3761,1342],{"class":1335},[503,3763,3707],{"class":846},[503,3765,1342],{"class":1335},[503,3767,1311],{"class":542},[503,3769,3770],{"class":712}," Produced",[503,3772,388],{"class":542},[503,3774,1117],{"class":513},[503,3776,756],{"class":542},[503,3778,3779],{"class":538},"windowedKeySerde",[503,3781,1311],{"class":542},[503,3783,1367],{"class":712},[503,3785,388],{"class":542},[503,3787,1127],{"class":513},[503,3789,1374],{"class":542},[320,3791,3131,3792,3794,3795,3798,3799,3802,3803,388],{},[329,3793,417],{}," instead for session windows. Both factories also exist as constructors — ",[329,3796,3797],{},"WindowedSerdes.TimeWindowedSerde(inner)"," and ",[329,3800,3801],{},"WindowedSerdes.SessionWindowedSerde(inner)"," — and expose the unwrapped inner serde via ",[329,3804,3805],{},"keySerde()",[855,3807,3808],{"color":857,"icon":858},[320,3809,3810,3813,3814,3817,3818,3821,3822,388],{},[324,3811,3812],{},"KS deviation:"," the factory methods take a ",[329,3815,3816],{},"Serde\u003CT>"," for the inner key (not a ",[329,3819,3820],{},"Class\u003CT>"," as in Kafka Streams), and there is no window-size argument — the window bounds are encoded directly in the serialized bytes. See ",[1443,3823,82],{"href":83},[436,3825,3827],{"id":3826},"avro-with-schema-registry","Avro with Schema Registry",[320,3829,3830,3831,3833],{},"Avro is the most common production serialization format with Kafka. StoatFlow has no Avro serde of its own — you use the Confluent ",[329,3832,426],{}," (or the generic\u002Freflection variants), the same one you'd use with Kafka Streams. StoatFlow's only role is to hand Schema Registry's URL to your default serdes; serdes you build yourself, you configure yourself.",[1039,3835,3837],{"id":3836},"build-setup","Build setup",[320,3839,3840,3841,3844,3845,3848,3849,3852],{},"Generate Java classes from your ",[329,3842,3843],{},".avsc"," schemas (the ",[329,3846,3847],{},"com.github.davidmc24.gradle.plugin.avro"," plugin against ",[329,3850,3851],{},"org.apache.avro:avro"," is one common choice), then depend on the Confluent serde from the Confluent Maven repository:",[493,3854,3856],{"className":495,"code":3855,"language":498,"meta":499,"style":499},"\u002F\u002F build.gradle.kts\nrepositories {\n    mavenCentral()\n    maven(\"https:\u002F\u002Fpackages.confluent.io\u002Fmaven\u002F\")\n}\n\ndependencies {\n    implementation(\"io.stoatflow:stoatflow-runtime:\u003Cstoatflow-version>\")\n    implementation(\"io.confluent:kafka-streams-avro-serde:8.0.0\")\n}\n",[329,3857,3858,3863,3870,3877,3889,3893,3897,3904,3916,3927],{"__ignoreMap":499},[503,3859,3860],{"class":505,"line":506},[503,3861,3862],{"class":852},"\u002F\u002F build.gradle.kts\n",[503,3864,3865,3868],{"class":505,"line":517},[503,3866,3867],{"class":513},"repositories",[503,3869,580],{"class":538},[503,3871,3872,3875],{"class":505,"line":525},[503,3873,3874],{"class":513},"    mavenCentral",[503,3876,2340],{"class":538},[503,3878,3879,3882,3884,3887],{"class":505,"line":532},[503,3880,3881],{"class":513},"    maven",[503,3883,756],{"class":538},[503,3885,3886],{"class":846},"\"https:\u002F\u002Fpackages.confluent.io\u002Fmaven\u002F\"",[503,3888,632],{"class":538},[503,3890,3891],{"class":505,"line":555},[503,3892,2403],{"class":538},[503,3894,3895],{"class":505,"line":572},[503,3896,529],{"emptyLinePlaceholder":528},[503,3898,3899,3902],{"class":505,"line":583},[503,3900,3901],{"class":513},"dependencies",[503,3903,580],{"class":538},[503,3905,3906,3909,3911,3914],{"class":505,"line":591},[503,3907,3908],{"class":513},"    implementation",[503,3910,756],{"class":538},[503,3912,3913],{"class":846},"\"io.stoatflow:stoatflow-runtime:\u003Cstoatflow-version>\"",[503,3915,632],{"class":538},[503,3917,3918,3920,3922,3925],{"class":505,"line":605},[503,3919,3908],{"class":513},[503,3921,756],{"class":538},[503,3923,3924],{"class":846},"\"io.confluent:kafka-streams-avro-serde:8.0.0\"",[503,3926,632],{"class":538},[503,3928,3929],{"class":505,"line":617},[503,3930,2403],{"class":538},[855,3932,3933,3947],{"color":3148,"icon":80},[320,3934,3935,3936,3939,3940,3942,3943,3946],{},"The Confluent serde transitively pulls ",[329,3937,3938],{},"kafka-clients:8.0.0-ccs",", but StoatFlow targets the Apache ",[329,3941,2193],{}," 4.x APIs. Pin the Apache version so Confluent's ",[329,3944,3945],{},"-ccs"," build doesn't win dependency resolution:",[493,3948,3950],{"className":495,"code":3949,"language":498,"meta":499,"style":499},"configurations.all {\n    resolutionStrategy.eachDependency {\n        if (requested.group == \"org.apache.kafka\" && requested.name == \"kafka-clients\") {\n            useVersion(\"4.3.1\") \u002F\u002F your Apache kafka-clients version\n        }\n    }\n}\n",[329,3951,3952,3962,3972,3998,4014,4018,4022],{"__ignoreMap":499},[503,3953,3954,3957,3960],{"class":505,"line":506},[503,3955,3956],{"class":538},"configurations.",[503,3958,3959],{"class":513},"all",[503,3961,580],{"class":538},[503,3963,3964,3967,3970],{"class":505,"line":517},[503,3965,3966],{"class":538},"    resolutionStrategy.",[503,3968,3969],{"class":513},"eachDependency",[503,3971,580],{"class":538},[503,3973,3974,3976,3979,3981,3984,3987,3990,3992,3995],{"class":505,"line":525},[503,3975,2810],{"class":509},[503,3977,3978],{"class":538}," (requested.group ",[503,3980,2818],{"class":708},[503,3982,3983],{"class":846}," \"org.apache.kafka\"",[503,3985,3986],{"class":708}," &&",[503,3988,3989],{"class":538}," requested.name ",[503,3991,2818],{"class":708},[503,3993,3994],{"class":846}," \"kafka-clients\"",[503,3996,3997],{"class":538},") {\n",[503,3999,4000,4003,4005,4008,4011],{"class":505,"line":532},[503,4001,4002],{"class":513},"            useVersion",[503,4004,756],{"class":538},[503,4006,4007],{"class":846},"\"4.3.1\"",[503,4009,4010],{"class":538},") ",[503,4012,4013],{"class":852},"\u002F\u002F your Apache kafka-clients version\n",[503,4015,4016],{"class":505,"line":555},[503,4017,620],{"class":538},[503,4019,4020],{"class":505,"line":572},[503,4021,2899],{"class":538},[503,4023,4024],{"class":505,"line":583},[503,4025,2403],{"class":538},[1039,4027,4029],{"id":4028},"pointing-serdes-at-schema-registry","Pointing serdes at Schema Registry",[320,4031,4032,4033,4035,4036,4039],{},"Set the registry URL once in ",[329,4034,819],{},". StoatFlow propagates it to the ",[324,4037,4038],{},"default"," key and value serdes at startup, so an Avro serde set as the default value serde is configured for you:",[493,4041,4043],{"className":823,"code":4042,"language":825,"meta":499,"style":499},"stoatflow:\n  application-id: news-article-publish-processor\n  bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:-localhost:9092}\n  schema-registry-url: ${SCHEMA_REGISTRY_URL:-http:\u002F\u002Flocalhost:8081}\n  default-key-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n",[329,4044,4045,4051,4061,4071,4081],{"__ignoreMap":499},[503,4046,4047,4049],{"class":505,"line":506},[503,4048,652],{"class":832},[503,4050,835],{"class":542},[503,4052,4053,4056,4058],{"class":505,"line":517},[503,4054,4055],{"class":832},"  application-id",[503,4057,843],{"class":542},[503,4059,4060],{"class":846}," news-article-publish-processor\n",[503,4062,4063,4066,4068],{"class":505,"line":525},[503,4064,4065],{"class":832},"  bootstrap-servers",[503,4067,843],{"class":542},[503,4069,4070],{"class":846}," ${KAFKA_BOOTSTRAP_SERVERS:-localhost:9092}\n",[503,4072,4073,4076,4078],{"class":505,"line":532},[503,4074,4075],{"class":832},"  schema-registry-url",[503,4077,843],{"class":542},[503,4079,4080],{"class":846}," ${SCHEMA_REGISTRY_URL:-http:\u002F\u002Flocalhost:8081}\n",[503,4082,4083,4085,4087],{"class":505,"line":555},[503,4084,840],{"class":832},[503,4086,843],{"class":542},[503,4088,847],{"class":846},[489,4090,4091,4202],{"group":491},[493,4092,4094],{"className":495,"code":4093,"filename":497,"language":498,"meta":499,"style":499},"import io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde\nimport io.stoatflow.runtime.StoatFlowRuntime\nimport org.apache.kafka.common.serialization.Serdes\n\nval runtime = StoatFlowRuntime.fromConfig(\n    topologyBuilder = { buildTopology(it) },\n    configure = {\n        streamsConfigOverrides {\n            defaultKeySerde(Serdes.String())\n            \u002F\u002F Configured automatically with schema-registry-url from YAML\n            defaultValueSerde(SpecificAvroSerde\u003CArticle>())\n        }\n    },\n)\n",[329,4095,4096,4103,4109,4115,4119,4133,4145,4153,4159,4169,4174,4190,4194,4198],{"__ignoreMap":499},[503,4097,4098,4100],{"class":505,"line":506},[503,4099,510],{"class":509},[503,4101,4102],{"class":513}," io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde\n",[503,4104,4105,4107],{"class":505,"line":517},[503,4106,510],{"class":509},[503,4108,514],{"class":513},[503,4110,4111,4113],{"class":505,"line":525},[503,4112,510],{"class":509},[503,4114,522],{"class":513},[503,4116,4117],{"class":505,"line":532},[503,4118,529],{"emptyLinePlaceholder":528},[503,4120,4121,4123,4125,4127,4129,4131],{"class":505,"line":555},[503,4122,535],{"class":509},[503,4124,539],{"class":538},[503,4126,543],{"class":542},[503,4128,546],{"class":538},[503,4130,549],{"class":513},[503,4132,552],{"class":538},[503,4134,4135,4137,4139,4141,4143],{"class":505,"line":572},[503,4136,558],{"class":538},[503,4138,543],{"class":542},[503,4140,563],{"class":538},[503,4142,566],{"class":513},[503,4144,569],{"class":538},[503,4146,4147,4149,4151],{"class":505,"line":583},[503,4148,575],{"class":538},[503,4150,543],{"class":542},[503,4152,580],{"class":538},[503,4154,4155,4157],{"class":505,"line":591},[503,4156,586],{"class":513},[503,4158,580],{"class":538},[503,4160,4161,4163,4165,4167],{"class":505,"line":605},[503,4162,594],{"class":513},[503,4164,597],{"class":538},[503,4166,476],{"class":513},[503,4168,602],{"class":538},[503,4170,4171],{"class":505,"line":617},[503,4172,4173],{"class":852},"            \u002F\u002F Configured automatically with schema-registry-url from YAML\n",[503,4175,4176,4178,4180,4182,4184,4187],{"class":505,"line":623},[503,4177,608],{"class":513},[503,4179,756],{"class":538},[503,4181,426],{"class":513},[503,4183,1306],{"class":538},[503,4185,4186],{"class":1482},"Article",[503,4188,4189],{"class":538},">())\n",[503,4191,4192],{"class":505,"line":629},[503,4193,620],{"class":538},[503,4195,4196],{"class":505,"line":1155},[503,4197,626],{"class":538},[503,4199,4200],{"class":505,"line":1163},[503,4201,632],{"class":538},[493,4203,4205],{"className":635,"code":4204,"filename":637,"language":638,"meta":499,"style":499},"import io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde;\nimport io.stoatflow.runtime.StoatFlowRuntime;\nimport org.apache.kafka.common.serialization.Serdes;\n\nvar runtime = StoatFlowRuntime.fromConfig(\n    Main::buildTopology,\n    builder -> builder.streamsConfigOverrides(cfg -> {\n        cfg.defaultKeySerde(Serdes.String());\n        \u002F\u002F Configured automatically with schema-registry-url from YAML\n        cfg.defaultValueSerde(new SpecificAvroSerde\u003C>());\n    }));\n",[329,4206,4207,4243,4263,4291,4295,4311,4321,4341,4359,4364,4382],{"__ignoreMap":499},[503,4208,4209,4211,4213,4215,4218,4220,4222,4224,4227,4229,4232,4234,4237,4239,4241],{"class":505,"line":506},[503,4210,510],{"class":509},[503,4212,647],{"class":538},[503,4214,388],{"class":542},[503,4216,4217],{"class":538},"confluent",[503,4219,388],{"class":542},[503,4221,682],{"class":538},[503,4223,388],{"class":542},[503,4225,4226],{"class":538},"streams",[503,4228,388],{"class":542},[503,4230,4231],{"class":538},"serdes",[503,4233,388],{"class":542},[503,4235,4236],{"class":538},"avro",[503,4238,388],{"class":542},[503,4240,426],{"class":538},[503,4242,665],{"class":542},[503,4244,4245,4247,4249,4251,4253,4255,4257,4259,4261],{"class":505,"line":517},[503,4246,510],{"class":509},[503,4248,647],{"class":538},[503,4250,388],{"class":542},[503,4252,652],{"class":538},[503,4254,388],{"class":542},[503,4256,657],{"class":538},[503,4258,388],{"class":542},[503,4260,662],{"class":538},[503,4262,665],{"class":542},[503,4264,4265,4267,4269,4271,4273,4275,4277,4279,4281,4283,4285,4287,4289],{"class":505,"line":525},[503,4266,510],{"class":509},[503,4268,672],{"class":538},[503,4270,388],{"class":542},[503,4272,677],{"class":538},[503,4274,388],{"class":542},[503,4276,682],{"class":538},[503,4278,388],{"class":542},[503,4280,687],{"class":538},[503,4282,388],{"class":542},[503,4284,692],{"class":538},[503,4286,388],{"class":542},[503,4288,697],{"class":538},[503,4290,665],{"class":542},[503,4292,4293],{"class":505,"line":532},[503,4294,529],{"emptyLinePlaceholder":528},[503,4296,4297,4299,4301,4303,4305,4307,4309],{"class":505,"line":555},[503,4298,709],{"class":708},[503,4300,713],{"class":712},[503,4302,716],{"class":542},[503,4304,719],{"class":712},[503,4306,388],{"class":542},[503,4308,549],{"class":513},[503,4310,552],{"class":542},[503,4312,4313,4315,4317,4319],{"class":505,"line":572},[503,4314,730],{"class":538},[503,4316,733],{"class":509},[503,4318,566],{"class":538},[503,4320,738],{"class":542},[503,4322,4323,4325,4327,4329,4331,4333,4335,4337,4339],{"class":505,"line":583},[503,4324,743],{"class":538},[503,4326,746],{"class":542},[503,4328,749],{"class":712},[503,4330,388],{"class":542},[503,4332,486],{"class":513},[503,4334,756],{"class":542},[503,4336,759],{"class":538},[503,4338,746],{"class":542},[503,4340,580],{"class":542},[503,4342,4343,4345,4347,4349,4351,4353,4355,4357],{"class":505,"line":591},[503,4344,768],{"class":712},[503,4346,388],{"class":542},[503,4348,773],{"class":513},[503,4350,756],{"class":542},[503,4352,697],{"class":712},[503,4354,388],{"class":542},[503,4356,476],{"class":513},[503,4358,784],{"class":542},[503,4360,4361],{"class":505,"line":605},[503,4362,4363],{"class":852},"        \u002F\u002F Configured automatically with schema-registry-url from YAML\n",[503,4365,4366,4368,4370,4372,4374,4376,4379],{"class":505,"line":617},[503,4367,768],{"class":712},[503,4369,388],{"class":542},[503,4371,793],{"class":513},[503,4373,756],{"class":542},[503,4375,3118],{"class":509},[503,4377,4378],{"class":538}," SpecificAvroSerde",[503,4380,4381],{"class":542},"\u003C>());\n",[503,4383,4384],{"class":505,"line":623},[503,4385,4386],{"class":542},"    }));\n",[855,4388,4389],{"color":857,"icon":858},[320,4390,4391,4392,4395,4396,370,4398,457,4400,4402],{},"The automatic propagation applies ",[324,4393,4394],{},"only to the default serdes",". Any Avro serde you build yourself and pass to a ",[329,4397,369],{},[329,4399,373],{},[329,4401,380],{}," must be configured by hand — StoatFlow never touches it.",[1039,4404,4406],{"id":4405},"per-operator-avro-serdes","Per-operator Avro serdes",[320,4408,4409,4410,4412,4413,398,4416,4419,4420,4423],{},"When different topics carry different Avro types — or you want the value serde on a specific source rather than as the global default — build each serde and call ",[329,4411,433],{}," with the registry URL before handing it to the operator. The boolean second argument is ",[329,4414,4415],{},"isKey",[329,4417,4418],{},"true"," for key serdes, ",[329,4421,4422],{},"false"," for value serdes):",[489,4425,4426,4528],{"group":491},[493,4427,4429],{"className":495,"code":4428,"filename":497,"language":498,"meta":499,"style":499},"import io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde\nimport org.apache.kafka.common.serialization.Serde\n\nfun createStockTickSerde(schemaRegistryUrl: String): Serde\u003CStockTick> {\n    val serde = SpecificAvroSerde\u003CStockTick>()\n    serde.configure(mapOf(\"schema.registry.url\" to schemaRegistryUrl), false)\n    return serde\n}\n",[329,4430,4431,4437,4443,4447,4472,4491,4516,4524],{"__ignoreMap":499},[503,4432,4433,4435],{"class":505,"line":506},[503,4434,510],{"class":509},[503,4436,4102],{"class":513},[503,4438,4439,4441],{"class":505,"line":517},[503,4440,510],{"class":509},[503,4442,2247],{"class":513},[503,4444,4445],{"class":505,"line":525},[503,4446,529],{"emptyLinePlaceholder":528},[503,4448,4449,4452,4455,4458,4460,4463,4465,4467,4470],{"class":505,"line":532},[503,4450,4451],{"class":509},"fun",[503,4453,4454],{"class":513}," createStockTickSerde",[503,4456,4457],{"class":538},"(schemaRegistryUrl: ",[503,4459,476],{"class":1482},[503,4461,4462],{"class":538},"): ",[503,4464,2513],{"class":1482},[503,4466,1306],{"class":538},[503,4468,4469],{"class":1482},"StockTick",[503,4471,2321],{"class":538},[503,4473,4474,4477,4480,4482,4484,4486,4488],{"class":505,"line":555},[503,4475,4476],{"class":509},"    val",[503,4478,4479],{"class":538}," serde ",[503,4481,543],{"class":542},[503,4483,4378],{"class":513},[503,4485,1306],{"class":538},[503,4487,4469],{"class":1482},[503,4489,4490],{"class":538},">()\n",[503,4492,4493,4496,4499,4501,4504,4506,4509,4512,4514],{"class":505,"line":572},[503,4494,4495],{"class":538},"    serde.",[503,4497,4498],{"class":513},"configure",[503,4500,756],{"class":538},[503,4502,4503],{"class":513},"mapOf",[503,4505,756],{"class":538},[503,4507,4508],{"class":846},"\"schema.registry.url\"",[503,4510,4511],{"class":538}," to schemaRegistryUrl), ",[503,4513,4422],{"class":509},[503,4515,632],{"class":538},[503,4517,4518,4521],{"class":505,"line":583},[503,4519,4520],{"class":509},"    return",[503,4522,4523],{"class":538}," serde\n",[503,4525,4526],{"class":505,"line":591},[503,4527,2403],{"class":538},[493,4529,4531],{"className":635,"code":4530,"filename":637,"language":638,"meta":499,"style":499},"import io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde;\nimport org.apache.kafka.common.serialization.Serde;\nimport java.util.Map;\n\nstatic Serde\u003CStockTick> createStockTickSerde(String schemaRegistryUrl) {\n    SpecificAvroSerde\u003CStockTick> serde = new SpecificAvroSerde\u003C>();\n    serde.configure(Map.of(\"schema.registry.url\", schemaRegistryUrl), false);\n    return serde;\n}\n",[329,4532,4533,4565,4593,4612,4616,4641,4664,4704,4712],{"__ignoreMap":499},[503,4534,4535,4537,4539,4541,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563],{"class":505,"line":506},[503,4536,510],{"class":509},[503,4538,647],{"class":538},[503,4540,388],{"class":542},[503,4542,4217],{"class":538},[503,4544,388],{"class":542},[503,4546,682],{"class":538},[503,4548,388],{"class":542},[503,4550,4226],{"class":538},[503,4552,388],{"class":542},[503,4554,4231],{"class":538},[503,4556,388],{"class":542},[503,4558,4236],{"class":538},[503,4560,388],{"class":542},[503,4562,426],{"class":538},[503,4564,665],{"class":542},[503,4566,4567,4569,4571,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591],{"class":505,"line":517},[503,4568,510],{"class":509},[503,4570,672],{"class":538},[503,4572,388],{"class":542},[503,4574,677],{"class":538},[503,4576,388],{"class":542},[503,4578,682],{"class":538},[503,4580,388],{"class":542},[503,4582,687],{"class":538},[503,4584,388],{"class":542},[503,4586,692],{"class":538},[503,4588,388],{"class":542},[503,4590,2513],{"class":538},[503,4592,665],{"class":542},[503,4594,4595,4597,4600,4602,4605,4607,4610],{"class":505,"line":525},[503,4596,510],{"class":509},[503,4598,4599],{"class":538}," java",[503,4601,388],{"class":542},[503,4603,4604],{"class":538},"util",[503,4606,388],{"class":542},[503,4608,4609],{"class":538},"Map",[503,4611,665],{"class":542},[503,4613,4614],{"class":505,"line":532},[503,4615,529],{"emptyLinePlaceholder":528},[503,4617,4618,4621,4624,4626,4628,4630,4632,4634,4637,4639],{"class":505,"line":555},[503,4619,4620],{"class":708},"static",[503,4622,4623],{"class":538}," Serde",[503,4625,1306],{"class":708},[503,4627,4469],{"class":538},[503,4629,1317],{"class":708},[503,4631,4454],{"class":513},[503,4633,756],{"class":542},[503,4635,4636],{"class":538},"String schemaRegistryUrl",[503,4638,1917],{"class":542},[503,4640,580],{"class":542},[503,4642,4643,4646,4648,4650,4652,4655,4657,4659,4661],{"class":505,"line":572},[503,4644,4645],{"class":538},"    SpecificAvroSerde",[503,4647,1306],{"class":542},[503,4649,4469],{"class":708},[503,4651,1317],{"class":542},[503,4653,4654],{"class":712}," serde",[503,4656,716],{"class":542},[503,4658,2760],{"class":509},[503,4660,4378],{"class":538},[503,4662,4663],{"class":542},"\u003C>();\n",[503,4665,4666,4669,4671,4673,4675,4677,4679,4682,4684,4686,4689,4691,4693,4696,4699,4702],{"class":505,"line":583},[503,4667,4668],{"class":712},"    serde",[503,4670,388],{"class":542},[503,4672,4498],{"class":513},[503,4674,756],{"class":542},[503,4676,4609],{"class":712},[503,4678,388],{"class":542},[503,4680,4681],{"class":513},"of",[503,4683,756],{"class":542},[503,4685,1342],{"class":1335},[503,4687,4688],{"class":846},"schema.registry.url",[503,4690,1342],{"class":1335},[503,4692,1311],{"class":542},[503,4694,4695],{"class":538}," schemaRegistryUrl",[503,4697,4698],{"class":542},"),",[503,4700,4701],{"class":509}," false",[503,4703,813],{"class":542},[503,4705,4706,4708,4710],{"class":505,"line":591},[503,4707,4520],{"class":509},[503,4709,4654],{"class":538},[503,4711,665],{"class":542},[503,4713,4714],{"class":505,"line":605},[503,4715,2403],{"class":542},[320,4717,4718],{},"Then wire the configured serde into the source or sink exactly like any other serde:",[489,4720,4721,4832],{"group":491},[493,4722,4724],{"className":495,"code":4723,"filename":497,"language":498,"meta":499,"style":499},"import io.stoatflow.core.topology.Consumed\nimport io.stoatflow.core.topology.Produced\nimport org.apache.kafka.common.serialization.Serdes\n\nval stockTickSerde = createStockTickSerde(schemaRegistryUrl)\n\nbuilder\n    .stream(\"stock-ticks\", Consumed.with(Serdes.String(), stockTickSerde))\n    \u002F\u002F ... processing ...\n    .to(\n        \"filtered-stock-ticks\",\n        Produced.with(Serdes.String(), stockTickSerde),\n    )\n",[329,4725,4726,4732,4738,4744,4748,4762,4766,4771,4794,4799,4807,4814,4828],{"__ignoreMap":499},[503,4727,4728,4730],{"class":505,"line":506},[503,4729,510],{"class":509},[503,4731,1064],{"class":513},[503,4733,4734,4736],{"class":505,"line":517},[503,4735,510],{"class":509},[503,4737,1071],{"class":513},[503,4739,4740,4742],{"class":505,"line":525},[503,4741,510],{"class":509},[503,4743,522],{"class":513},[503,4745,4746],{"class":505,"line":532},[503,4747,529],{"emptyLinePlaceholder":528},[503,4749,4750,4752,4755,4757,4759],{"class":505,"line":555},[503,4751,535],{"class":509},[503,4753,4754],{"class":538}," stockTickSerde ",[503,4756,543],{"class":542},[503,4758,4454],{"class":513},[503,4760,4761],{"class":538},"(schemaRegistryUrl)\n",[503,4763,4764],{"class":505,"line":572},[503,4765,529],{"emptyLinePlaceholder":528},[503,4767,4768],{"class":505,"line":583},[503,4769,4770],{"class":538},"builder\n",[503,4772,4773,4775,4777,4779,4782,4785,4787,4789,4791],{"class":505,"line":591},[503,4774,1676],{"class":538},[503,4776,917],{"class":513},[503,4778,756],{"class":538},[503,4780,4781],{"class":846},"\"stock-ticks\"",[503,4783,4784],{"class":538},", Consumed.",[503,4786,1117],{"class":513},[503,4788,597],{"class":538},[503,4790,476],{"class":513},[503,4792,4793],{"class":538},"(), stockTickSerde))\n",[503,4795,4796],{"class":505,"line":605},[503,4797,4798],{"class":852},"    \u002F\u002F ... processing ...\n",[503,4800,4801,4803,4805],{"class":505,"line":617},[503,4802,1676],{"class":538},[503,4804,947],{"class":513},[503,4806,552],{"class":538},[503,4808,4809,4812],{"class":505,"line":623},[503,4810,4811],{"class":846},"        \"filtered-stock-ticks\"",[503,4813,738],{"class":538},[503,4815,4816,4819,4821,4823,4825],{"class":505,"line":629},[503,4817,4818],{"class":538},"        Produced.",[503,4820,1117],{"class":513},[503,4822,597],{"class":538},[503,4824,476],{"class":513},[503,4826,4827],{"class":538},"(), stockTickSerde),\n",[503,4829,4830],{"class":505,"line":1155},[503,4831,1716],{"class":538},[493,4833,4835],{"className":635,"code":4834,"filename":637,"language":638,"meta":499,"style":499},"import io.stoatflow.core.topology.Consumed;\nimport io.stoatflow.core.topology.Produced;\nimport org.apache.kafka.common.serialization.Serde;\nimport org.apache.kafka.common.serialization.Serdes;\n\nSerde\u003CStockTick> stockTickSerde = createStockTickSerde(schemaRegistryUrl);\n\nbuilder\n    .stream(\"stock-ticks\", Consumed.with(Serdes.String(), stockTickSerde))\n    \u002F\u002F ... processing ...\n    .to(\n        \"filtered-stock-ticks\",\n        Produced.with(Serdes.String(), stockTickSerde));\n",[329,4836,4837,4861,4885,4913,4941,4945,4969,4973,4977,5015,5019,5027,5039],{"__ignoreMap":499},[503,4838,4839,4841,4843,4845,4847,4849,4851,4853,4855,4857,4859],{"class":505,"line":506},[503,4840,510],{"class":509},[503,4842,647],{"class":538},[503,4844,388],{"class":542},[503,4846,652],{"class":538},[503,4848,388],{"class":542},[503,4850,1203],{"class":538},[503,4852,388],{"class":542},[503,4854,1208],{"class":538},[503,4856,388],{"class":542},[503,4858,369],{"class":538},[503,4860,665],{"class":542},[503,4862,4863,4865,4867,4869,4871,4873,4875,4877,4879,4881,4883],{"class":505,"line":517},[503,4864,510],{"class":509},[503,4866,647],{"class":538},[503,4868,388],{"class":542},[503,4870,652],{"class":538},[503,4872,388],{"class":542},[503,4874,1203],{"class":538},[503,4876,388],{"class":542},[503,4878,1208],{"class":538},[503,4880,388],{"class":542},[503,4882,373],{"class":538},[503,4884,665],{"class":542},[503,4886,4887,4889,4891,4893,4895,4897,4899,4901,4903,4905,4907,4909,4911],{"class":505,"line":525},[503,4888,510],{"class":509},[503,4890,672],{"class":538},[503,4892,388],{"class":542},[503,4894,677],{"class":538},[503,4896,388],{"class":542},[503,4898,682],{"class":538},[503,4900,388],{"class":542},[503,4902,687],{"class":538},[503,4904,388],{"class":542},[503,4906,692],{"class":538},[503,4908,388],{"class":542},[503,4910,2513],{"class":538},[503,4912,665],{"class":542},[503,4914,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939],{"class":505,"line":532},[503,4916,510],{"class":509},[503,4918,672],{"class":538},[503,4920,388],{"class":542},[503,4922,677],{"class":538},[503,4924,388],{"class":542},[503,4926,682],{"class":538},[503,4928,388],{"class":542},[503,4930,687],{"class":538},[503,4932,388],{"class":542},[503,4934,692],{"class":538},[503,4936,388],{"class":542},[503,4938,697],{"class":538},[503,4940,665],{"class":542},[503,4942,4943],{"class":505,"line":555},[503,4944,529],{"emptyLinePlaceholder":528},[503,4946,4947,4949,4951,4953,4955,4958,4960,4962,4964,4967],{"class":505,"line":572},[503,4948,2513],{"class":538},[503,4950,1306],{"class":542},[503,4952,4469],{"class":708},[503,4954,1317],{"class":542},[503,4956,4957],{"class":712}," stockTickSerde",[503,4959,716],{"class":542},[503,4961,4454],{"class":513},[503,4963,756],{"class":542},[503,4965,4966],{"class":538},"schemaRegistryUrl",[503,4968,813],{"class":542},[503,4970,4971],{"class":505,"line":583},[503,4972,529],{"emptyLinePlaceholder":528},[503,4974,4975],{"class":505,"line":591},[503,4976,4770],{"class":538},[503,4978,4979,4981,4983,4985,4987,4990,4992,4994,4997,4999,5001,5003,5005,5007,5009,5011,5013],{"class":505,"line":605},[503,4980,1676],{"class":542},[503,4982,917],{"class":513},[503,4984,756],{"class":542},[503,4986,1342],{"class":1335},[503,4988,4989],{"class":846},"stock-ticks",[503,4991,1342],{"class":1335},[503,4993,1311],{"class":542},[503,4995,4996],{"class":712}," Consumed",[503,4998,388],{"class":542},[503,5000,1117],{"class":513},[503,5002,756],{"class":542},[503,5004,697],{"class":712},[503,5006,388],{"class":542},[503,5008,476],{"class":513},[503,5010,1364],{"class":542},[503,5012,4957],{"class":538},[503,5014,1954],{"class":542},[503,5016,5017],{"class":505,"line":617},[503,5018,4798],{"class":852},[503,5020,5021,5023,5025],{"class":505,"line":623},[503,5022,1676],{"class":542},[503,5024,947],{"class":513},[503,5026,552],{"class":542},[503,5028,5029,5032,5035,5037],{"class":505,"line":629},[503,5030,5031],{"class":1335},"        \"",[503,5033,5034],{"class":846},"filtered-stock-ticks",[503,5036,1342],{"class":1335},[503,5038,738],{"class":542},[503,5040,5041,5044,5046,5048,5050,5052,5054,5056,5058,5060],{"class":505,"line":1155},[503,5042,5043],{"class":712},"        Produced",[503,5045,388],{"class":542},[503,5047,1117],{"class":513},[503,5049,756],{"class":542},[503,5051,697],{"class":712},[503,5053,388],{"class":542},[503,5055,476],{"class":513},[503,5057,1364],{"class":542},[503,5059,4957],{"class":538},[503,5061,5062],{"class":542},"));\n",[1039,5064,5066],{"id":5065},"testing-avro-topologies","Testing Avro topologies",[320,5068,5069,5070,5073,5074,5077,5078,5081],{},"For unit tests against the in-memory ",[1443,5071,5072],{"href":106},"test driver",", configure your Avro serdes against Confluent's ",[324,5075,5076],{},"mock"," Schema Registry (",[329,5079,5080],{},"mock:\u002F\u002F...",") instead of a live one — it keeps schemas in-process, so no broker or registry is needed:",[489,5083,5084,5182],{"group":491},[493,5085,5087],{"className":495,"code":5086,"filename":497,"language":498,"meta":499,"style":499},"import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig\nimport io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde\n\nfun stockTickSerde(): SpecificAvroSerde\u003CStockTick> {\n    val serde = SpecificAvroSerde\u003CStockTick>()\n    serde.configure(\n        mapOf(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG to \"mock:\u002F\u002Fschema-registry\"),\n        false,\n    )\n    return serde\n}\n",[329,5088,5089,5096,5102,5106,5123,5139,5147,5161,5168,5172,5178],{"__ignoreMap":499},[503,5090,5091,5093],{"class":505,"line":506},[503,5092,510],{"class":509},[503,5094,5095],{"class":513}," io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig\n",[503,5097,5098,5100],{"class":505,"line":517},[503,5099,510],{"class":509},[503,5101,4102],{"class":513},[503,5103,5104],{"class":505,"line":525},[503,5105,529],{"emptyLinePlaceholder":528},[503,5107,5108,5110,5112,5115,5117,5119,5121],{"class":505,"line":532},[503,5109,4451],{"class":509},[503,5111,4957],{"class":513},[503,5113,5114],{"class":538},"(): ",[503,5116,426],{"class":1482},[503,5118,1306],{"class":538},[503,5120,4469],{"class":1482},[503,5122,2321],{"class":538},[503,5124,5125,5127,5129,5131,5133,5135,5137],{"class":505,"line":555},[503,5126,4476],{"class":509},[503,5128,4479],{"class":538},[503,5130,543],{"class":542},[503,5132,4378],{"class":513},[503,5134,1306],{"class":538},[503,5136,4469],{"class":1482},[503,5138,4490],{"class":538},[503,5140,5141,5143,5145],{"class":505,"line":572},[503,5142,4495],{"class":538},[503,5144,4498],{"class":513},[503,5146,552],{"class":538},[503,5148,5149,5152,5155,5158],{"class":505,"line":583},[503,5150,5151],{"class":513},"        mapOf",[503,5153,5154],{"class":538},"(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG to ",[503,5156,5157],{"class":846},"\"mock:\u002F\u002Fschema-registry\"",[503,5159,5160],{"class":538},"),\n",[503,5162,5163,5166],{"class":505,"line":591},[503,5164,5165],{"class":509},"        false",[503,5167,738],{"class":538},[503,5169,5170],{"class":505,"line":605},[503,5171,1716],{"class":538},[503,5173,5174,5176],{"class":505,"line":617},[503,5175,4520],{"class":509},[503,5177,4523],{"class":538},[503,5179,5180],{"class":505,"line":623},[503,5181,2403],{"class":538},[493,5183,5185],{"className":635,"code":5184,"filename":637,"language":638,"meta":499,"style":499},"import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig;\nimport io.confluent.kafka.streams.serdes.avro.SpecificAvroSerde;\nimport java.util.Map;\n\nstatic SpecificAvroSerde\u003CStockTick> stockTickSerde() {\n    SpecificAvroSerde\u003CStockTick> serde = new SpecificAvroSerde\u003C>();\n    serde.configure(\n        Map.of(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, \"mock:\u002F\u002Fschema-registry\"),\n        false);\n    return serde;\n}\n",[329,5186,5187,5213,5245,5261,5265,5284,5304,5314,5344,5350,5358],{"__ignoreMap":499},[503,5188,5189,5191,5193,5195,5197,5199,5201,5203,5206,5208,5211],{"class":505,"line":506},[503,5190,510],{"class":509},[503,5192,647],{"class":538},[503,5194,388],{"class":542},[503,5196,4217],{"class":538},[503,5198,388],{"class":542},[503,5200,682],{"class":538},[503,5202,388],{"class":542},[503,5204,5205],{"class":538},"serializers",[503,5207,388],{"class":542},[503,5209,5210],{"class":538},"AbstractKafkaSchemaSerDeConfig",[503,5212,665],{"class":542},[503,5214,5215,5217,5219,5221,5223,5225,5227,5229,5231,5233,5235,5237,5239,5241,5243],{"class":505,"line":517},[503,5216,510],{"class":509},[503,5218,647],{"class":538},[503,5220,388],{"class":542},[503,5222,4217],{"class":538},[503,5224,388],{"class":542},[503,5226,682],{"class":538},[503,5228,388],{"class":542},[503,5230,4226],{"class":538},[503,5232,388],{"class":542},[503,5234,4231],{"class":538},[503,5236,388],{"class":542},[503,5238,4236],{"class":538},[503,5240,388],{"class":542},[503,5242,426],{"class":538},[503,5244,665],{"class":542},[503,5246,5247,5249,5251,5253,5255,5257,5259],{"class":505,"line":525},[503,5248,510],{"class":509},[503,5250,4599],{"class":538},[503,5252,388],{"class":542},[503,5254,4604],{"class":538},[503,5256,388],{"class":542},[503,5258,4609],{"class":538},[503,5260,665],{"class":542},[503,5262,5263],{"class":505,"line":532},[503,5264,529],{"emptyLinePlaceholder":528},[503,5266,5267,5269,5271,5273,5275,5277,5279,5282],{"class":505,"line":555},[503,5268,4620],{"class":708},[503,5270,4378],{"class":538},[503,5272,1306],{"class":708},[503,5274,4469],{"class":538},[503,5276,1317],{"class":708},[503,5278,4957],{"class":513},[503,5280,5281],{"class":542},"()",[503,5283,580],{"class":542},[503,5285,5286,5288,5290,5292,5294,5296,5298,5300,5302],{"class":505,"line":572},[503,5287,4645],{"class":538},[503,5289,1306],{"class":542},[503,5291,4469],{"class":708},[503,5293,1317],{"class":542},[503,5295,4654],{"class":712},[503,5297,716],{"class":542},[503,5299,2760],{"class":509},[503,5301,4378],{"class":538},[503,5303,4663],{"class":542},[503,5305,5306,5308,5310,5312],{"class":505,"line":583},[503,5307,4668],{"class":712},[503,5309,388],{"class":542},[503,5311,4498],{"class":513},[503,5313,552],{"class":542},[503,5315,5316,5319,5321,5323,5325,5327,5329,5332,5334,5337,5340,5342],{"class":505,"line":591},[503,5317,5318],{"class":712},"        Map",[503,5320,388],{"class":542},[503,5322,4681],{"class":513},[503,5324,756],{"class":542},[503,5326,5210],{"class":712},[503,5328,388],{"class":542},[503,5330,5331],{"class":712},"SCHEMA_REGISTRY_URL_CONFIG",[503,5333,1311],{"class":542},[503,5335,5336],{"class":1335}," \"",[503,5338,5339],{"class":846},"mock:\u002F\u002Fschema-registry",[503,5341,1342],{"class":1335},[503,5343,5160],{"class":542},[503,5345,5346,5348],{"class":505,"line":605},[503,5347,5165],{"class":509},[503,5349,813],{"class":542},[503,5351,5352,5354,5356],{"class":505,"line":617},[503,5353,4520],{"class":509},[503,5355,4654],{"class":538},[503,5357,665],{"class":542},[503,5359,5360],{"class":505,"line":623},[503,5361,2403],{"class":542},[320,5363,5364,5365,5367,5368,5372,5373,5376],{},"When ",[329,5366,430],{}," is configured, the runtime also exposes a ",[1443,5369,5371],{"href":5370},"\u002Fdocs\u002Fconcepts\u002Farchitecture#failure-modes-and-observability","Schema Registry health check"," on ",[329,5374,5375],{},"\u002Fhealth\u002Fready"," that auto-enables itself — no extra wiring required.",[436,5378,5380],{"id":5379},"next-steps","Next steps",[340,5382,5383,5393,5403,5410],{},[343,5384,5385,5389,5390,5392],{},[324,5386,5387],{},[1443,5388,100],{"href":101}," — the rest of ",[329,5391,380],{},": store types, changelog, caching, retention.",[343,5394,5395,5399,5400,5402],{},[324,5396,5397],{},[1443,5398,125],{"href":126}," — where ",[329,5401,3179],{}," keys come from and how windows close.",[343,5404,5405,5409],{},[324,5406,5407],{},[1443,5408,95],{"href":96}," — what happens when a record fails to deserialize.",[343,5411,5412,5417],{},[324,5413,5414],{},[1443,5415,5416],{"href":106},"Testing"," — drive a topology end-to-end in-memory with the test driver.",[5419,5420,5421],"style",{},"html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .suHK_, html code.shiki .suHK_{--shiki-default:#393A34}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .s8zF2, html code.shiki .s8zF2{--shiki-default:#A0ADA0}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .sUxyF, html code.shiki .sUxyF{--shiki-default:#2E8F82}",{"title":499,"searchDepth":517,"depth":517,"links":5423},[5424,5425,5426,5430,5431,5432,5433,5439],{"id":438,"depth":517,"text":439},{"id":480,"depth":517,"text":347},{"id":867,"depth":517,"text":365,"children":5427},[5428,5429],{"id":1041,"depth":525,"text":1042},{"id":1614,"depth":525,"text":1615},{"id":2040,"depth":517,"text":2041},{"id":2199,"depth":517,"text":2200},{"id":3169,"depth":517,"text":410},{"id":3826,"depth":517,"text":3827,"children":5434},[5435,5436,5437,5438],{"id":3836,"depth":525,"text":3837},{"id":4028,"depth":525,"text":4029},{"id":4405,"depth":525,"text":4406},{"id":5065,"depth":525,"text":5066},{"id":5379,"depth":517,"text":5380},"Configure default and per-operator serdes, use the built-in Serdes, write custom serdes, serialize windowed keys, and wire up Avro with Confluent Schema Registry.","md",{},{"icon":148},"how-to",{"title":145,"description":5440},"KfKmw1135Y-lDGtSw9OmjqgjV8lq4ekgHsdV3dvZz-8",[5448,5450],{"title":140,"path":141,"stem":142,"description":5449,"icon":143,"children":-1},"Generate records on an interval or a cron schedule with StreamsBuilder.scheduled() — a topology source that emits without consuming from Kafka.",{"title":155,"path":151,"stem":152,"description":5451,"icon":75,"children":-1},"How the StoatFlow runtime loads configuration — application.yaml on the classpath, overlay files, environment variables, system properties, and the layered precedence order.",1783713359734]