[{"data":1,"prerenderedAt":2883},["ShallowReactive",2],{"navigation_docs":3,"-articles-binary-serialization":195,"-articles-binary-serialization-surround":2882},[4,27,61,75,100,126,147,177],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":26},"Introduction","icon-park-outline:home","\u002Fintroduction\u002Fabout-mion","\u002Fintroduction","1.introduction",[11,14,18,22],{"title":12,"path":7,"stem":13},"About mion","1.introduction\u002F1.about-mion",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",{"title":19,"path":20,"stem":21},"Manual Install","\u002Fintroduction\u002Fmanual-install","1.introduction\u002F3.manual-install",{"title":23,"path":24,"stem":25},"What's Next","\u002Fintroduction\u002Fwhat-is-next","1.introduction\u002F4.what-is-next",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Server","icon-park-outline:server","\u002Fserver","20.server",[33,37,41,45,49,53,57],{"title":34,"path":35,"stem":36},"Router Overview","\u002Fserver\u002Foverview","20.server\u002F0.overview",{"title":38,"path":39,"stem":40},"Routes","\u002Fserver\u002Froutes","20.server\u002F1.routes",{"title":42,"path":43,"stem":44},"Middleware","\u002Fserver\u002Fmiddle-fns","20.server\u002F2.middle-fns",{"title":46,"path":47,"stem":48},"Request & Response","\u002Fserver\u002Frequest-and-response","20.server\u002F5.request-and-response",{"title":50,"path":51,"stem":52},"Error Handling","\u002Fserver\u002Ferror-handling","20.server\u002F6.error-handling",{"title":54,"path":55,"stem":56},"Validation","\u002Fserver\u002Fvalidation","20.server\u002F7.validation",{"title":58,"path":59,"stem":60},"Serialization","\u002Fserver\u002Fserialization","20.server\u002F8.serialization",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":26},"Drizzle ORM","i-lineicons-drizzle","\u002Fdrizzle-orm","21.drizzle-orm",[67,71],{"title":68,"path":69,"stem":70},"Drizzle Overview","\u002Fdrizzle-orm\u002Fdrizzle-overview","21.drizzle-orm\u002F0.drizzle-overview",{"title":72,"path":73,"stem":74},"Column Mapping","\u002Fdrizzle-orm\u002Fcolumn-mapping","21.drizzle-orm\u002F1.column-mapping",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":26},"Client","icon-park-outline:computer","\u002Fclient","3.client",[81,85,88,92,96],{"title":82,"path":83,"stem":84},"Client Overview","\u002Fclient\u002Fclient-overview","3.client\u002F0.client-overview",{"title":50,"path":86,"stem":87},"\u002Fclient\u002Ferror-handling","3.client\u002F1.error-handling",{"title":89,"path":90,"stem":91},"Validation Errors","\u002Fclient\u002Fvalidation-errors","3.client\u002F2.validation-errors",{"title":93,"path":94,"stem":95},"Routes Flow","\u002Fclient\u002Fclient-flow","3.client\u002F3.client-flow",{"title":97,"path":98,"stem":99},"Cancellation & Timeouts","\u002Fclient\u002Fcancellation-timeouts","3.client\u002F4.cancellation-timeouts",{"title":101,"icon":102,"redirect":103,"path":104,"stem":105,"children":106,"page":26},"RunTypes","i-lucide-scan-text","\u002Frun-types\u002Foverview","\u002Frun-types","4.run-types",[107,110,114,118,122],{"title":108,"path":103,"stem":109},"RunTypes Overview","4.run-types\u002F0.overview",{"title":111,"path":112,"stem":113},"Supported Types","\u002Frun-types\u002Ffeatures","4.run-types\u002F1.features",{"title":115,"path":116,"stem":117},"Type Formats","\u002Frun-types\u002Ftype-formats","4.run-types\u002F2.type-formats",{"title":119,"path":120,"stem":121},"Built-in Formats","\u002Frun-types\u002Fbuilt-in-formats","4.run-types\u002F3.built-in-formats",{"title":123,"path":124,"stem":125},"Caveats","\u002Frun-types\u002Fcaveats","4.run-types\u002F4.caveats",{"title":127,"path":128,"stem":129,"children":130,"page":26},"Devtools","\u002Fdevtools","5.devtools",[131,135,139,143],{"title":132,"path":133,"stem":134},"AOT Compilation","\u002Fdevtools\u002Faot-compilation","5.devtools\u002F0.aot-compilation",{"title":136,"path":137,"stem":138},"Pure Functions","\u002Fdevtools\u002Fpure-functions","5.devtools\u002F1.pure-functions",{"title":140,"path":141,"stem":142},"ESLint Rules","\u002Fdevtools\u002Feslint-rules","5.devtools\u002F2.eslint-rules",{"title":144,"path":145,"stem":146},"Vite Configuration","\u002Fdevtools\u002Fvite-config","5.devtools\u002F3.vite-config",{"title":148,"redirect":149,"icon":150,"path":151,"stem":152,"children":153,"page":26},"Platforms","\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Fplatforms","6.platforms",[154,157,161,165,169,173],{"title":155,"path":149,"stem":156},"Node.js","6.platforms\u002F1.node-js",{"title":158,"path":159,"stem":160},"Bun","\u002Fplatforms\u002Fbun","6.platforms\u002F2.bun",{"title":162,"path":163,"stem":164},"AWS Lambda","\u002Fplatforms\u002Faws-lambda","6.platforms\u002F3.aws-lambda",{"title":166,"path":167,"stem":168},"Google Cloud Functions","\u002Fplatforms\u002Fgoogle-cloud-functions","6.platforms\u002F4.google-cloud-functions",{"title":170,"path":171,"stem":172},"Cloudflare Workers","\u002Fplatforms\u002Fcloudflare","6.platforms\u002F5.cloudflare",{"title":174,"path":175,"stem":176},"Vercel","\u002Fplatforms\u002Fvercel","6.platforms\u002F6.vercel",{"title":178,"icon":179,"redirect":180,"path":181,"stem":182,"children":183,"page":26},"Benchmarks","icon-park-outline:chart-line","\u002Fbenchmarks\u002Fhello-world","\u002Fbenchmarks","7.benchmarks",[184,187,191],{"title":185,"path":180,"stem":186},"Hello World","7.benchmarks\u002F1.hello-world",{"title":188,"path":189,"stem":190},"Light Validation","\u002Fbenchmarks\u002Flight-validation","7.benchmarks\u002F2.light-validation",{"title":192,"path":193,"stem":194},"Heavy Validation","\u002Fbenchmarks\u002Fheavy-validation","7.benchmarks\u002F3.heavy-validation",{"id":196,"title":197,"body":198,"description":2874,"extension":2875,"links":2876,"meta":2877,"navigation":26,"path":2878,"seo":2879,"stem":2880,"__hash__":2881},"docs\u002F9.articles\u002F1.binary-serialization.md","Binary Serialization Deep Dive",{"type":199,"value":200,"toc":2843},"minimark",[201,205,209,214,217,326,329,333,336,353,363,367,372,375,524,528,531,653,656,667,671,674,742,746,749,835,838,842,845,938,941,989,993,996,1058,1062,1065,1144,1148,1152,1159,1180,1184,1285,1289,1292,1298,1304,1309,1403,1407,1410,1416,1420,1423,1429,1432,1435,1455,1459,1462,1496,1499,1819,1823,1826,1886,1889,2253,2257,2260,2292,2634,2638,2642,2645,2720,2724,2727,2753,2756,2776,2780,2783,2803,2807,2810,2813,2839],[202,203,197],"h1",{"id":204},"binary-serialization-deep-dive",[206,207,208],"p",{},"mion's binary serialization is a custom protocol designed specifically for TypeScript applications. Unlike generic binary formats, it leverages compile-time type information to generate highly optimized serializers that support the full range of TypeScript features.",[210,211,213],"h2",{"id":212},"why-not-protocol-buffers","Why Not Protocol Buffers?",[206,215,216],{},"Protocol Buffers, MessagePack, and similar formats are excellent general-purpose solutions, but they come with limitations for TypeScript applications:",[218,219,220,236],"table",{},[221,222,223],"thead",{},[224,225,226,230,233],"tr",{},[227,228,229],"th",{},"Feature",[227,231,232],{},"Protocol Buffers",[227,234,235],{},"mion Binary",[237,238,239,256,267,277,286,295,304,315],"tbody",{},[224,240,241,245,253],{},[242,243,244],"td",{},"Schema definition",[242,246,247,248,252],{},"Separate ",[249,250,251],"code",{},".proto"," files",[242,254,255],{},"TypeScript types",[224,257,258,261,264],{},[242,259,260],{},"Union types",[242,262,263],{},"Limited (oneof)",[242,265,266],{},"Full support",[224,268,269,272,275],{},[242,270,271],{},"Intersection types",[242,273,274],{},"Not supported",[242,276,266],{},[224,278,279,282,284],{},[242,280,281],{},"Circular types",[242,283,274],{},[242,285,266],{},[224,287,288,291,293],{},[242,289,290],{},"Rest parameters",[242,292,274],{},[242,294,266],{},[224,296,297,300,302],{},[242,298,299],{},"Generics",[242,301,274],{},[242,303,266],{},[224,305,306,309,312],{},[242,307,308],{},"Optional properties",[242,310,311],{},"Supported",[242,313,314],{},"Optimized with bitmaps",[224,316,317,320,323],{},[242,318,319],{},"Type safety",[242,321,322],{},"Requires code generation",[242,324,325],{},"Native TypeScript",[206,327,328],{},"Since mion controls both client and server serialization, we can optimize the protocol specifically for our use case without needing to maintain compatibility with external systems.",[210,330,332],{"id":331},"architecture-overview","Architecture Overview",[206,334,335],{},"The binary serialization system consists of two main components:",[337,338,339,347],"ol",{},[340,341,342,346],"li",{},[343,344,345],"strong",{},"Type Analysis"," -  reflection system extracts type metadata at compile time",[340,348,349,352],{},[343,350,351],{},"JIT Compilation"," - Serialization functions are generated at runtime based on the type structure",[354,355,360],"pre",{"className":356,"code":358,"language":359},[357],"language-text","TypeScript Type → reflection → JIT Compiler → Optimized Serializer\n","text",[249,361,358],{"__ignoreMap":362},"",[210,364,366],{"id":365},"supported-typescript-features","Supported TypeScript Features",[368,369,371],"h3",{"id":370},"primitive-types","Primitive Types",[206,373,374],{},"All JavaScript primitives are supported with optimized encodings:",[354,376,380],{"className":377,"code":378,"language":379,"meta":362,"style":362},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type Primitives = {\n    str: string;        \u002F\u002F Length-prefixed UTF-8\n    num: number;        \u002F\u002F 64-bit float\n    bool: boolean;      \u002F\u002F Single byte\n    big: bigint;        \u002F\u002F String-encoded for precision\n    sym: symbol;        \u002F\u002F Description as string\n    nil: null;          \u002F\u002F Single byte marker\n    undef: undefined;   \u002F\u002F Single byte marker\n};\n","ts",[249,381,382,402,422,438,454,470,486,502,518],{"__ignoreMap":362},[383,384,387,391,395,399],"span",{"class":385,"line":386},"line",1,[383,388,390],{"class":389},"spNyl","type",[383,392,394],{"class":393},"sBMFI"," Primitives",[383,396,398],{"class":397},"sMK4o"," =",[383,400,401],{"class":397}," {\n",[383,403,405,409,412,415,418],{"class":385,"line":404},2,[383,406,408],{"class":407},"swJcz","    str",[383,410,411],{"class":397},":",[383,413,414],{"class":393}," string",[383,416,417],{"class":397},";",[383,419,421],{"class":420},"sHwdD","        \u002F\u002F Length-prefixed UTF-8\n",[383,423,425,428,430,433,435],{"class":385,"line":424},3,[383,426,427],{"class":407},"    num",[383,429,411],{"class":397},[383,431,432],{"class":393}," number",[383,434,417],{"class":397},[383,436,437],{"class":420},"        \u002F\u002F 64-bit float\n",[383,439,441,444,446,449,451],{"class":385,"line":440},4,[383,442,443],{"class":407},"    bool",[383,445,411],{"class":397},[383,447,448],{"class":393}," boolean",[383,450,417],{"class":397},[383,452,453],{"class":420},"      \u002F\u002F Single byte\n",[383,455,457,460,462,465,467],{"class":385,"line":456},5,[383,458,459],{"class":407},"    big",[383,461,411],{"class":397},[383,463,464],{"class":393}," bigint",[383,466,417],{"class":397},[383,468,469],{"class":420},"        \u002F\u002F String-encoded for precision\n",[383,471,473,476,478,481,483],{"class":385,"line":472},6,[383,474,475],{"class":407},"    sym",[383,477,411],{"class":397},[383,479,480],{"class":393}," symbol",[383,482,417],{"class":397},[383,484,485],{"class":420},"        \u002F\u002F Description as string\n",[383,487,489,492,494,497,499],{"class":385,"line":488},7,[383,490,491],{"class":407},"    nil",[383,493,411],{"class":397},[383,495,496],{"class":393}," null",[383,498,417],{"class":397},[383,500,501],{"class":420},"          \u002F\u002F Single byte marker\n",[383,503,505,508,510,513,515],{"class":385,"line":504},8,[383,506,507],{"class":407},"    undef",[383,509,411],{"class":397},[383,511,512],{"class":393}," undefined",[383,514,417],{"class":397},[383,516,517],{"class":420},"   \u002F\u002F Single byte marker\n",[383,519,521],{"class":385,"line":520},9,[383,522,523],{"class":397},"};\n",[368,525,527],{"id":526},"union-types","Union Types",[206,529,530],{},"Union types are encoded with a discriminator index followed by the value:",[354,532,534],{"className":377,"code":533,"language":379,"meta":362,"style":362},"type Result = string | number | boolean;\n\u002F\u002F Binary: [union_index: uint8, value: ...]\n\ntype ApiResponse = \n    | { type: 'success'; data: User }\n    | { type: 'error'; message: string };\n\u002F\u002F Discriminated unions use the discriminator property\n",[249,535,536,559,564,570,583,619,648],{"__ignoreMap":362},[383,537,538,540,543,545,547,550,552,554,556],{"class":385,"line":386},[383,539,390],{"class":389},[383,541,542],{"class":393}," Result",[383,544,398],{"class":397},[383,546,414],{"class":393},[383,548,549],{"class":397}," |",[383,551,432],{"class":393},[383,553,549],{"class":397},[383,555,448],{"class":393},[383,557,558],{"class":397},";\n",[383,560,561],{"class":385,"line":404},[383,562,563],{"class":420},"\u002F\u002F Binary: [union_index: uint8, value: ...]\n",[383,565,566],{"class":385,"line":424},[383,567,569],{"emptyLinePlaceholder":568},true,"\n",[383,571,572,574,577,579],{"class":385,"line":440},[383,573,390],{"class":389},[383,575,576],{"class":393}," ApiResponse",[383,578,398],{"class":397},[383,580,582],{"class":581},"sTEyZ"," \n",[383,584,585,588,591,594,596,599,603,606,608,611,613,616],{"class":385,"line":456},[383,586,587],{"class":397},"    |",[383,589,590],{"class":397}," {",[383,592,593],{"class":407}," type",[383,595,411],{"class":397},[383,597,598],{"class":397}," '",[383,600,602],{"class":601},"sfazB","success",[383,604,605],{"class":397},"'",[383,607,417],{"class":397},[383,609,610],{"class":407}," data",[383,612,411],{"class":397},[383,614,615],{"class":393}," User",[383,617,618],{"class":397}," }\n",[383,620,621,623,625,627,629,631,634,636,638,641,643,645],{"class":385,"line":472},[383,622,587],{"class":397},[383,624,590],{"class":397},[383,626,593],{"class":407},[383,628,411],{"class":397},[383,630,598],{"class":397},[383,632,633],{"class":601},"error",[383,635,605],{"class":397},[383,637,417],{"class":397},[383,639,640],{"class":407}," message",[383,642,411],{"class":397},[383,644,414],{"class":393},[383,646,647],{"class":397}," };\n",[383,649,650],{"class":385,"line":488},[383,651,652],{"class":420},"\u002F\u002F Discriminated unions use the discriminator property\n",[206,654,655],{},"The JIT compiler generates code that:",[337,657,658,661,664],{},[340,659,660],{},"Determines which union member matches the value",[340,662,663],{},"Writes the member index (uint8 for ≤255 members, uint16 otherwise)",[340,665,666],{},"Serializes the value according to its type",[368,668,670],{"id":669},"intersection-types","Intersection Types",[206,672,673],{},"Intersection types are flattened and serialized as a single object:",[354,675,677],{"className":377,"code":676,"language":379,"meta":362,"style":362},"type Named = { name: string };\ntype Aged = { age: number };\ntype Person = Named & Aged;\n\u002F\u002F Serialized as: { name: string, age: number }\n",[249,678,679,699,719,737],{"__ignoreMap":362},[383,680,681,683,686,688,690,693,695,697],{"class":385,"line":386},[383,682,390],{"class":389},[383,684,685],{"class":393}," Named",[383,687,398],{"class":397},[383,689,590],{"class":397},[383,691,692],{"class":407}," name",[383,694,411],{"class":397},[383,696,414],{"class":393},[383,698,647],{"class":397},[383,700,701,703,706,708,710,713,715,717],{"class":385,"line":404},[383,702,390],{"class":389},[383,704,705],{"class":393}," Aged",[383,707,398],{"class":397},[383,709,590],{"class":397},[383,711,712],{"class":407}," age",[383,714,411],{"class":397},[383,716,432],{"class":393},[383,718,647],{"class":397},[383,720,721,723,726,728,730,733,735],{"class":385,"line":424},[383,722,390],{"class":389},[383,724,725],{"class":393}," Person",[383,727,398],{"class":397},[383,729,685],{"class":393},[383,731,732],{"class":397}," &",[383,734,705],{"class":393},[383,736,558],{"class":397},[383,738,739],{"class":385,"line":440},[383,740,741],{"class":420},"\u002F\u002F Serialized as: { name: string, age: number }\n",[368,743,745],{"id":744},"circularrecursive-types","Circular\u002FRecursive Types",[206,747,748],{},"mion fully supports circular type definitions:",[354,750,752],{"className":377,"code":751,"language":379,"meta":362,"style":362},"type TreeNode = {\n    value: number;\n    children: TreeNode[];\n};\n\ntype LinkedList = {\n    value: string;\n    next?: LinkedList;\n};\n",[249,753,754,765,776,790,794,798,809,819,831],{"__ignoreMap":362},[383,755,756,758,761,763],{"class":385,"line":386},[383,757,390],{"class":389},[383,759,760],{"class":393}," TreeNode",[383,762,398],{"class":397},[383,764,401],{"class":397},[383,766,767,770,772,774],{"class":385,"line":404},[383,768,769],{"class":407},"    value",[383,771,411],{"class":397},[383,773,432],{"class":393},[383,775,558],{"class":397},[383,777,778,781,783,785,788],{"class":385,"line":424},[383,779,780],{"class":407},"    children",[383,782,411],{"class":397},[383,784,760],{"class":393},[383,786,787],{"class":581},"[]",[383,789,558],{"class":397},[383,791,792],{"class":385,"line":440},[383,793,523],{"class":397},[383,795,796],{"class":385,"line":456},[383,797,569],{"emptyLinePlaceholder":568},[383,799,800,802,805,807],{"class":385,"line":472},[383,801,390],{"class":389},[383,803,804],{"class":393}," LinkedList",[383,806,398],{"class":397},[383,808,401],{"class":397},[383,810,811,813,815,817],{"class":385,"line":488},[383,812,769],{"class":407},[383,814,411],{"class":397},[383,816,414],{"class":393},[383,818,558],{"class":397},[383,820,821,824,827,829],{"class":385,"line":504},[383,822,823],{"class":407},"    next",[383,825,826],{"class":397},"?:",[383,828,804],{"class":393},[383,830,558],{"class":397},[383,832,833],{"class":385,"line":520},[383,834,523],{"class":397},[206,836,837],{},"The JIT compiler handles circular references by generating recursive serialization code with proper termination conditions.",[368,839,841],{"id":840},"tuples-and-rest-parameters","Tuples and Rest Parameters",[206,843,844],{},"Tuples are serialized as fixed-length arrays:",[354,846,848],{"className":377,"code":847,"language":379,"meta":362,"style":362},"type Point3D = [number, number, number];\n\u002F\u002F Binary: [x: float64, y: float64, z: float64]\n\ntype LogEntry = [timestamp: Date, level: string, ...messages: string[]];\n\u002F\u002F Binary: [timestamp: float64, level: string, length: uint32, ...messages]\n",[249,849,850,879,884,888,933],{"__ignoreMap":362},[383,851,852,854,857,859,862,865,868,870,872,874,877],{"class":385,"line":386},[383,853,390],{"class":389},[383,855,856],{"class":393}," Point3D",[383,858,398],{"class":397},[383,860,861],{"class":581}," [",[383,863,864],{"class":393},"number",[383,866,867],{"class":397},",",[383,869,432],{"class":393},[383,871,867],{"class":397},[383,873,432],{"class":393},[383,875,876],{"class":581},"]",[383,878,558],{"class":397},[383,880,881],{"class":385,"line":404},[383,882,883],{"class":420},"\u002F\u002F Binary: [x: float64, y: float64, z: float64]\n",[383,885,886],{"class":385,"line":424},[383,887,569],{"emptyLinePlaceholder":568},[383,889,890,892,895,897,899,902,904,907,909,912,914,916,918,921,924,926,928,931],{"class":385,"line":440},[383,891,390],{"class":389},[383,893,894],{"class":393}," LogEntry",[383,896,398],{"class":397},[383,898,861],{"class":581},[383,900,901],{"class":393},"timestamp",[383,903,411],{"class":397},[383,905,906],{"class":393}," Date",[383,908,867],{"class":397},[383,910,911],{"class":393}," level",[383,913,411],{"class":397},[383,915,414],{"class":393},[383,917,867],{"class":397},[383,919,920],{"class":397}," ...",[383,922,923],{"class":393},"messages",[383,925,411],{"class":397},[383,927,414],{"class":393},[383,929,930],{"class":581},"[]]",[383,932,558],{"class":397},[383,934,935],{"class":385,"line":456},[383,936,937],{"class":420},"\u002F\u002F Binary: [timestamp: float64, level: string, length: uint32, ...messages]\n",[206,939,940],{},"Rest parameters in function signatures are fully supported:",[354,942,944],{"className":377,"code":943,"language":379,"meta":362,"style":362},"type Logger = (level: string, ...messages: string[]) => void;\n",[249,945,946],{"__ignoreMap":362},[383,947,948,950,953,955,958,962,964,966,968,970,972,974,976,978,981,984,987],{"class":385,"line":386},[383,949,390],{"class":389},[383,951,952],{"class":393}," Logger",[383,954,398],{"class":397},[383,956,957],{"class":397}," (",[383,959,961],{"class":960},"sHdIc","level",[383,963,411],{"class":397},[383,965,414],{"class":393},[383,967,867],{"class":397},[383,969,920],{"class":397},[383,971,923],{"class":960},[383,973,411],{"class":397},[383,975,414],{"class":393},[383,977,787],{"class":581},[383,979,980],{"class":397},")",[383,982,983],{"class":389}," =>",[383,985,986],{"class":393}," void",[383,988,558],{"class":397},[368,990,992],{"id":991},"maps-and-sets","Maps and Sets",[206,994,995],{},"Native JavaScript collections are serialized efficiently:",[354,997,999],{"className":377,"code":998,"language":379,"meta":362,"style":362},"type UserCache = Map\u003Cstring, User>;\n\u002F\u002F Binary: [size: uint32, ...entries: [key, value][]]\n\ntype Tags = Set\u003Cstring>;\n\u002F\u002F Binary: [size: uint32, ...values: string[]]\n",[249,1000,1001,1026,1031,1035,1053],{"__ignoreMap":362},[383,1002,1003,1005,1008,1010,1013,1016,1019,1021,1023],{"class":385,"line":386},[383,1004,390],{"class":389},[383,1006,1007],{"class":393}," UserCache",[383,1009,398],{"class":397},[383,1011,1012],{"class":393}," Map",[383,1014,1015],{"class":397},"\u003C",[383,1017,1018],{"class":393},"string",[383,1020,867],{"class":397},[383,1022,615],{"class":393},[383,1024,1025],{"class":397},">;\n",[383,1027,1028],{"class":385,"line":404},[383,1029,1030],{"class":420},"\u002F\u002F Binary: [size: uint32, ...entries: [key, value][]]\n",[383,1032,1033],{"class":385,"line":424},[383,1034,569],{"emptyLinePlaceholder":568},[383,1036,1037,1039,1042,1044,1047,1049,1051],{"class":385,"line":440},[383,1038,390],{"class":389},[383,1040,1041],{"class":393}," Tags",[383,1043,398],{"class":397},[383,1045,1046],{"class":393}," Set",[383,1048,1015],{"class":397},[383,1050,1018],{"class":393},[383,1052,1025],{"class":397},[383,1054,1055],{"class":385,"line":456},[383,1056,1057],{"class":420},"\u002F\u002F Binary: [size: uint32, ...values: string[]]\n",[368,1059,1061],{"id":1060},"classes","Classes",[206,1063,1064],{},"Classes are serialized as plain objects, with support for custom serialization:",[354,1066,1068],{"className":377,"code":1067,"language":379,"meta":362,"style":362},"class User {\n    constructor(\n        public id: number,\n        public name: string,\n        public createdAt: Date\n    ) {}\n}\n\u002F\u002F Serialized as: { id: number, name: string, createdAt: Date }\n",[249,1069,1070,1079,1087,1102,1114,1126,1134,1139],{"__ignoreMap":362},[383,1071,1072,1075,1077],{"class":385,"line":386},[383,1073,1074],{"class":389},"class",[383,1076,615],{"class":393},[383,1078,401],{"class":397},[383,1080,1081,1084],{"class":385,"line":404},[383,1082,1083],{"class":389},"    constructor",[383,1085,1086],{"class":397},"(\n",[383,1088,1089,1092,1095,1097,1099],{"class":385,"line":424},[383,1090,1091],{"class":389},"        public",[383,1093,1094],{"class":960}," id",[383,1096,411],{"class":397},[383,1098,432],{"class":393},[383,1100,1101],{"class":397},",\n",[383,1103,1104,1106,1108,1110,1112],{"class":385,"line":440},[383,1105,1091],{"class":389},[383,1107,692],{"class":960},[383,1109,411],{"class":397},[383,1111,414],{"class":393},[383,1113,1101],{"class":397},[383,1115,1116,1118,1121,1123],{"class":385,"line":456},[383,1117,1091],{"class":389},[383,1119,1120],{"class":960}," createdAt",[383,1122,411],{"class":397},[383,1124,1125],{"class":393}," Date\n",[383,1127,1128,1131],{"class":385,"line":472},[383,1129,1130],{"class":397},"    )",[383,1132,1133],{"class":397}," {}\n",[383,1135,1136],{"class":385,"line":488},[383,1137,1138],{"class":397},"}\n",[383,1140,1141],{"class":385,"line":504},[383,1142,1143],{"class":420},"\u002F\u002F Serialized as: { id: number, name: string, createdAt: Date }\n",[210,1145,1147],{"id":1146},"binary-encoding-format","Binary Encoding Format",[368,1149,1151],{"id":1150},"memory-alignment","Memory Alignment",[206,1153,1154,1155,1158],{},"All data is encoded into a ",[249,1156,1157],{},"Uint8Array"," using patterns optimized for CPU performance:",[1160,1161,1162,1168,1174],"ul",{},[340,1163,1164,1167],{},[343,1165,1166],{},"32-bit alignment"," for integers and floats where possible",[340,1169,1170,1173],{},[343,1171,1172],{},"Direct typed array access"," for fast read\u002Fwrite operations",[340,1175,1176,1179],{},[343,1177,1178],{},"Pre-allocated buffers"," with simple index tracking",[368,1181,1183],{"id":1182},"type-encodings","Type Encodings",[218,1185,1186,1199],{},[221,1187,1188],{},[224,1189,1190,1193,1196],{},[227,1191,1192],{},"Type",[227,1194,1195],{},"Encoding",[227,1197,1198],{},"Size",[237,1200,1201,1214,1226,1238,1250,1262,1274],{},[224,1202,1203,1208,1211],{},[242,1204,1205],{},[249,1206,1207],{},"boolean",[242,1209,1210],{},"uint8 (0 or 1)",[242,1212,1213],{},"1 byte",[224,1215,1216,1220,1223],{},[242,1217,1218],{},[249,1219,864],{},[242,1221,1222],{},"float64 (little-endian)",[242,1224,1225],{},"8 bytes",[224,1227,1228,1232,1235],{},[242,1229,1230],{},[249,1231,1018],{},[242,1233,1234],{},"uint32 length + UTF-8 bytes",[242,1236,1237],{},"4 + n bytes",[224,1239,1240,1245,1248],{},[242,1241,1242],{},[249,1243,1244],{},"bigint",[242,1246,1247],{},"String-encoded",[242,1249,1237],{},[224,1251,1252,1257,1260],{},[242,1253,1254],{},[249,1255,1256],{},"Date",[242,1258,1259],{},"float64 timestamp",[242,1261,1225],{},[224,1263,1264,1269,1272],{},[242,1265,1266],{},[249,1267,1268],{},"null",[242,1270,1271],{},"uint8 marker",[242,1273,1213],{},[224,1275,1276,1281,1283],{},[242,1277,1278],{},[249,1279,1280],{},"undefined",[242,1282,1271],{},[242,1284,1213],{},[368,1286,1288],{"id":1287},"object-encoding","Object Encoding",[206,1290,1291],{},"Objects use a schema-aware encoding that eliminates property names:",[354,1293,1296],{"className":1294,"code":1295,"language":359},[357],"Required Properties: [value1, value2, value3, ...]\nOptional Properties: [bitmap, present_value1, present_value2, ...]\n",[249,1297,1295],{"__ignoreMap":362},[206,1299,1300,1303],{},[343,1301,1302],{},"Required properties"," are serialized in declaration order without names, since both encoder and decoder know the schema.",[206,1305,1306,1308],{},[343,1307,308],{}," use a bitmap where each bit indicates whether the corresponding property is present:",[354,1310,1312],{"className":377,"code":1311,"language":379,"meta":362,"style":362},"type User = {\n    id: number;           \u002F\u002F Required - always present\n    name: string;         \u002F\u002F Required - always present\n    email?: string;       \u002F\u002F Optional - bit 0\n    phone?: string;       \u002F\u002F Optional - bit 1\n    avatar?: string;      \u002F\u002F Optional - bit 2\n};\n\u002F\u002F Binary: [id, name, bitmap: uint8, ...present_optionals]\n",[249,1313,1314,1324,1338,1352,1366,1380,1394,1398],{"__ignoreMap":362},[383,1315,1316,1318,1320,1322],{"class":385,"line":386},[383,1317,390],{"class":389},[383,1319,615],{"class":393},[383,1321,398],{"class":397},[383,1323,401],{"class":397},[383,1325,1326,1329,1331,1333,1335],{"class":385,"line":404},[383,1327,1328],{"class":407},"    id",[383,1330,411],{"class":397},[383,1332,432],{"class":393},[383,1334,417],{"class":397},[383,1336,1337],{"class":420},"           \u002F\u002F Required - always present\n",[383,1339,1340,1343,1345,1347,1349],{"class":385,"line":424},[383,1341,1342],{"class":407},"    name",[383,1344,411],{"class":397},[383,1346,414],{"class":393},[383,1348,417],{"class":397},[383,1350,1351],{"class":420},"         \u002F\u002F Required - always present\n",[383,1353,1354,1357,1359,1361,1363],{"class":385,"line":440},[383,1355,1356],{"class":407},"    email",[383,1358,826],{"class":397},[383,1360,414],{"class":393},[383,1362,417],{"class":397},[383,1364,1365],{"class":420},"       \u002F\u002F Optional - bit 0\n",[383,1367,1368,1371,1373,1375,1377],{"class":385,"line":456},[383,1369,1370],{"class":407},"    phone",[383,1372,826],{"class":397},[383,1374,414],{"class":393},[383,1376,417],{"class":397},[383,1378,1379],{"class":420},"       \u002F\u002F Optional - bit 1\n",[383,1381,1382,1385,1387,1389,1391],{"class":385,"line":472},[383,1383,1384],{"class":407},"    avatar",[383,1386,826],{"class":397},[383,1388,414],{"class":393},[383,1390,417],{"class":397},[383,1392,1393],{"class":420},"      \u002F\u002F Optional - bit 2\n",[383,1395,1396],{"class":385,"line":488},[383,1397,523],{"class":397},[383,1399,1400],{"class":385,"line":504},[383,1401,1402],{"class":420},"\u002F\u002F Binary: [id, name, bitmap: uint8, ...present_optionals]\n",[368,1404,1406],{"id":1405},"array-encoding","Array Encoding",[206,1408,1409],{},"Arrays are prefixed with their length:",[354,1411,1414],{"className":1412,"code":1413,"language":359},[357],"[length: uint32, element1, element2, ...]\n",[249,1415,1413],{"__ignoreMap":362},[368,1417,1419],{"id":1418},"union-encoding","Union Encoding",[206,1421,1422],{},"Unions include a discriminator index:",[354,1424,1427],{"className":1425,"code":1426,"language":359},[357],"[member_index: uint8|uint16, value: ...]\n",[249,1428,1426],{"__ignoreMap":362},[210,1430,351],{"id":1431},"jit-compilation",[206,1433,1434],{},"The JIT compiler generates specialized serialization functions for each type. This approach provides:",[1160,1436,1437,1443,1449],{},[340,1438,1439,1442],{},[343,1440,1441],{},"Zero runtime type checking"," - Types are known at compile time",[340,1444,1445,1448],{},[343,1446,1447],{},"Inlined operations"," - No function call overhead for primitives",[340,1450,1451,1454],{},[343,1452,1453],{},"Optimized branching"," - Union type checks are ordered by likelihood",[368,1456,1458],{"id":1457},"example-generated-serializer","Example: Generated Serializer",[206,1460,1461],{},"For a simple type like:",[354,1463,1465],{"className":377,"code":1464,"language":379,"meta":362,"style":362},"type Point = { x: number; y: number };\n",[249,1466,1467],{"__ignoreMap":362},[383,1468,1469,1471,1474,1476,1478,1481,1483,1485,1487,1490,1492,1494],{"class":385,"line":386},[383,1470,390],{"class":389},[383,1472,1473],{"class":393}," Point",[383,1475,398],{"class":397},[383,1477,590],{"class":397},[383,1479,1480],{"class":407}," x",[383,1482,411],{"class":397},[383,1484,432],{"class":393},[383,1486,417],{"class":397},[383,1488,1489],{"class":407}," y",[383,1491,411],{"class":397},[383,1493,432],{"class":393},[383,1495,647],{"class":397},[206,1497,1498],{},"The JIT compiler generates code equivalent to:",[354,1500,1502],{"className":377,"code":1501,"language":379,"meta":362,"style":362},"\u002F\u002F Serialization (simplified)\nfunction serialize(value: Point, buffer: SerContext): void {\n    buffer.view.setFloat64(buffer.index, value.x, true);\n    buffer.index += 8;\n    buffer.view.setFloat64(buffer.index, value.y, true);\n    buffer.index += 8;\n}\n\n\u002F\u002F Deserialization (simplified)\nfunction deserialize(buffer: DesContext): Point {\n    const x = buffer.view.getFloat64(buffer.index, true);\n    buffer.index += 8;\n    const y = buffer.view.getFloat64(buffer.index, true);\n    buffer.index += 8;\n    return { x, y };\n}\n",[249,1503,1504,1509,1545,1591,1608,1645,1659,1663,1667,1672,1695,1732,1747,1782,1797,1814],{"__ignoreMap":362},[383,1505,1506],{"class":385,"line":386},[383,1507,1508],{"class":420},"\u002F\u002F Serialization (simplified)\n",[383,1510,1511,1514,1518,1521,1524,1526,1528,1530,1533,1535,1538,1541,1543],{"class":385,"line":404},[383,1512,1513],{"class":389},"function",[383,1515,1517],{"class":1516},"s2Zo4"," serialize",[383,1519,1520],{"class":397},"(",[383,1522,1523],{"class":960},"value",[383,1525,411],{"class":397},[383,1527,1473],{"class":393},[383,1529,867],{"class":397},[383,1531,1532],{"class":960}," buffer",[383,1534,411],{"class":397},[383,1536,1537],{"class":393}," SerContext",[383,1539,1540],{"class":397},"):",[383,1542,986],{"class":393},[383,1544,401],{"class":397},[383,1546,1547,1550,1553,1556,1558,1561,1563,1566,1568,1571,1573,1576,1578,1581,1583,1587,1589],{"class":385,"line":424},[383,1548,1549],{"class":581},"    buffer",[383,1551,1552],{"class":397},".",[383,1554,1555],{"class":581},"view",[383,1557,1552],{"class":397},[383,1559,1560],{"class":1516},"setFloat64",[383,1562,1520],{"class":407},[383,1564,1565],{"class":581},"buffer",[383,1567,1552],{"class":397},[383,1569,1570],{"class":581},"index",[383,1572,867],{"class":397},[383,1574,1575],{"class":581}," value",[383,1577,1552],{"class":397},[383,1579,1580],{"class":581},"x",[383,1582,867],{"class":397},[383,1584,1586],{"class":1585},"sfNiH"," true",[383,1588,980],{"class":407},[383,1590,558],{"class":397},[383,1592,1593,1595,1597,1599,1602,1606],{"class":385,"line":440},[383,1594,1549],{"class":581},[383,1596,1552],{"class":397},[383,1598,1570],{"class":581},[383,1600,1601],{"class":397}," +=",[383,1603,1605],{"class":1604},"sbssI"," 8",[383,1607,558],{"class":397},[383,1609,1610,1612,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1637,1639,1641,1643],{"class":385,"line":456},[383,1611,1549],{"class":581},[383,1613,1552],{"class":397},[383,1615,1555],{"class":581},[383,1617,1552],{"class":397},[383,1619,1560],{"class":1516},[383,1621,1520],{"class":407},[383,1623,1565],{"class":581},[383,1625,1552],{"class":397},[383,1627,1570],{"class":581},[383,1629,867],{"class":397},[383,1631,1575],{"class":581},[383,1633,1552],{"class":397},[383,1635,1636],{"class":581},"y",[383,1638,867],{"class":397},[383,1640,1586],{"class":1585},[383,1642,980],{"class":407},[383,1644,558],{"class":397},[383,1646,1647,1649,1651,1653,1655,1657],{"class":385,"line":472},[383,1648,1549],{"class":581},[383,1650,1552],{"class":397},[383,1652,1570],{"class":581},[383,1654,1601],{"class":397},[383,1656,1605],{"class":1604},[383,1658,558],{"class":397},[383,1660,1661],{"class":385,"line":488},[383,1662,1138],{"class":397},[383,1664,1665],{"class":385,"line":504},[383,1666,569],{"emptyLinePlaceholder":568},[383,1668,1669],{"class":385,"line":520},[383,1670,1671],{"class":420},"\u002F\u002F Deserialization (simplified)\n",[383,1673,1675,1677,1680,1682,1684,1686,1689,1691,1693],{"class":385,"line":1674},10,[383,1676,1513],{"class":389},[383,1678,1679],{"class":1516}," deserialize",[383,1681,1520],{"class":397},[383,1683,1565],{"class":960},[383,1685,411],{"class":397},[383,1687,1688],{"class":393}," DesContext",[383,1690,1540],{"class":397},[383,1692,1473],{"class":393},[383,1694,401],{"class":397},[383,1696,1698,1701,1703,1705,1707,1709,1711,1713,1716,1718,1720,1722,1724,1726,1728,1730],{"class":385,"line":1697},11,[383,1699,1700],{"class":389},"    const",[383,1702,1480],{"class":581},[383,1704,398],{"class":397},[383,1706,1532],{"class":581},[383,1708,1552],{"class":397},[383,1710,1555],{"class":581},[383,1712,1552],{"class":397},[383,1714,1715],{"class":1516},"getFloat64",[383,1717,1520],{"class":407},[383,1719,1565],{"class":581},[383,1721,1552],{"class":397},[383,1723,1570],{"class":581},[383,1725,867],{"class":397},[383,1727,1586],{"class":1585},[383,1729,980],{"class":407},[383,1731,558],{"class":397},[383,1733,1735,1737,1739,1741,1743,1745],{"class":385,"line":1734},12,[383,1736,1549],{"class":581},[383,1738,1552],{"class":397},[383,1740,1570],{"class":581},[383,1742,1601],{"class":397},[383,1744,1605],{"class":1604},[383,1746,558],{"class":397},[383,1748,1750,1752,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780],{"class":385,"line":1749},13,[383,1751,1700],{"class":389},[383,1753,1489],{"class":581},[383,1755,398],{"class":397},[383,1757,1532],{"class":581},[383,1759,1552],{"class":397},[383,1761,1555],{"class":581},[383,1763,1552],{"class":397},[383,1765,1715],{"class":1516},[383,1767,1520],{"class":407},[383,1769,1565],{"class":581},[383,1771,1552],{"class":397},[383,1773,1570],{"class":581},[383,1775,867],{"class":397},[383,1777,1586],{"class":1585},[383,1779,980],{"class":407},[383,1781,558],{"class":397},[383,1783,1785,1787,1789,1791,1793,1795],{"class":385,"line":1784},14,[383,1786,1549],{"class":581},[383,1788,1552],{"class":397},[383,1790,1570],{"class":581},[383,1792,1601],{"class":397},[383,1794,1605],{"class":1604},[383,1796,558],{"class":397},[383,1798,1800,1804,1806,1808,1810,1812],{"class":385,"line":1799},15,[383,1801,1803],{"class":1802},"s7zQu","    return",[383,1805,590],{"class":397},[383,1807,1480],{"class":581},[383,1809,867],{"class":397},[383,1811,1489],{"class":581},[383,1813,647],{"class":397},[383,1815,1817],{"class":385,"line":1816},16,[383,1818,1138],{"class":397},[368,1820,1822],{"id":1821},"complex-type-example","Complex Type Example",[206,1824,1825],{},"For a more complex type with optional properties:",[354,1827,1829],{"className":377,"code":1828,"language":379,"meta":362,"style":362},"type User = {\n    id: number;\n    name: string;\n    email?: string;\n    age?: number;\n};\n",[249,1830,1831,1841,1851,1861,1871,1882],{"__ignoreMap":362},[383,1832,1833,1835,1837,1839],{"class":385,"line":386},[383,1834,390],{"class":389},[383,1836,615],{"class":393},[383,1838,398],{"class":397},[383,1840,401],{"class":397},[383,1842,1843,1845,1847,1849],{"class":385,"line":404},[383,1844,1328],{"class":407},[383,1846,411],{"class":397},[383,1848,432],{"class":393},[383,1850,558],{"class":397},[383,1852,1853,1855,1857,1859],{"class":385,"line":424},[383,1854,1342],{"class":407},[383,1856,411],{"class":397},[383,1858,414],{"class":393},[383,1860,558],{"class":397},[383,1862,1863,1865,1867,1869],{"class":385,"line":440},[383,1864,1356],{"class":407},[383,1866,826],{"class":397},[383,1868,414],{"class":393},[383,1870,558],{"class":397},[383,1872,1873,1876,1878,1880],{"class":385,"line":456},[383,1874,1875],{"class":407},"    age",[383,1877,826],{"class":397},[383,1879,432],{"class":393},[383,1881,558],{"class":397},[383,1883,1884],{"class":385,"line":472},[383,1885,523],{"class":397},[206,1887,1888],{},"The generated serializer handles the optional property bitmap:",[354,1890,1892],{"className":377,"code":1891,"language":379,"meta":362,"style":362},"\u002F\u002F Serialization (simplified)\nfunction serialize(value: User, ser: SerContext): void {\n    \u002F\u002F Required properties first\n    ser.view.setFloat64(ser.index, value.id, true);\n    ser.index += 8;\n    ser.serString(value.name);\n    \n    \u002F\u002F Initialize bitmap for optional props\n    const bitmapIndex = ser.index;\n    ser.view.setUint8(ser.index++, 0);\n    \n    \u002F\u002F Optional properties with bitmap\n    if (value.email !== undefined) {\n        ser.serString(value.email);\n        ser.setBitMask(bitmapIndex, 0);\n    }\n    if (value.age !== undefined) {\n        ser.view.setFloat64(ser.index, value.age, true);\n        ser.index += 8;\n        ser.setBitMask(bitmapIndex, 1);\n    }\n}\n",[249,1893,1894,1898,1927,1932,1971,1985,2007,2012,2017,2034,2065,2069,2074,2099,2120,2142,2147,2169,2206,2221,2243,2248],{"__ignoreMap":362},[383,1895,1896],{"class":385,"line":386},[383,1897,1508],{"class":420},[383,1899,1900,1902,1904,1906,1908,1910,1912,1914,1917,1919,1921,1923,1925],{"class":385,"line":404},[383,1901,1513],{"class":389},[383,1903,1517],{"class":1516},[383,1905,1520],{"class":397},[383,1907,1523],{"class":960},[383,1909,411],{"class":397},[383,1911,615],{"class":393},[383,1913,867],{"class":397},[383,1915,1916],{"class":960}," ser",[383,1918,411],{"class":397},[383,1920,1537],{"class":393},[383,1922,1540],{"class":397},[383,1924,986],{"class":393},[383,1926,401],{"class":397},[383,1928,1929],{"class":385,"line":424},[383,1930,1931],{"class":420},"    \u002F\u002F Required properties first\n",[383,1933,1934,1937,1939,1941,1943,1945,1947,1950,1952,1954,1956,1958,1960,1963,1965,1967,1969],{"class":385,"line":440},[383,1935,1936],{"class":581},"    ser",[383,1938,1552],{"class":397},[383,1940,1555],{"class":581},[383,1942,1552],{"class":397},[383,1944,1560],{"class":1516},[383,1946,1520],{"class":407},[383,1948,1949],{"class":581},"ser",[383,1951,1552],{"class":397},[383,1953,1570],{"class":581},[383,1955,867],{"class":397},[383,1957,1575],{"class":581},[383,1959,1552],{"class":397},[383,1961,1962],{"class":581},"id",[383,1964,867],{"class":397},[383,1966,1586],{"class":1585},[383,1968,980],{"class":407},[383,1970,558],{"class":397},[383,1972,1973,1975,1977,1979,1981,1983],{"class":385,"line":456},[383,1974,1936],{"class":581},[383,1976,1552],{"class":397},[383,1978,1570],{"class":581},[383,1980,1601],{"class":397},[383,1982,1605],{"class":1604},[383,1984,558],{"class":397},[383,1986,1987,1989,1991,1994,1996,1998,2000,2003,2005],{"class":385,"line":472},[383,1988,1936],{"class":581},[383,1990,1552],{"class":397},[383,1992,1993],{"class":1516},"serString",[383,1995,1520],{"class":407},[383,1997,1523],{"class":581},[383,1999,1552],{"class":397},[383,2001,2002],{"class":581},"name",[383,2004,980],{"class":407},[383,2006,558],{"class":397},[383,2008,2009],{"class":385,"line":488},[383,2010,2011],{"class":407},"    \n",[383,2013,2014],{"class":385,"line":504},[383,2015,2016],{"class":420},"    \u002F\u002F Initialize bitmap for optional props\n",[383,2018,2019,2021,2024,2026,2028,2030,2032],{"class":385,"line":520},[383,2020,1700],{"class":389},[383,2022,2023],{"class":581}," bitmapIndex",[383,2025,398],{"class":397},[383,2027,1916],{"class":581},[383,2029,1552],{"class":397},[383,2031,1570],{"class":581},[383,2033,558],{"class":397},[383,2035,2036,2038,2040,2042,2044,2047,2049,2051,2053,2055,2058,2061,2063],{"class":385,"line":1674},[383,2037,1936],{"class":581},[383,2039,1552],{"class":397},[383,2041,1555],{"class":581},[383,2043,1552],{"class":397},[383,2045,2046],{"class":1516},"setUint8",[383,2048,1520],{"class":407},[383,2050,1949],{"class":581},[383,2052,1552],{"class":397},[383,2054,1570],{"class":581},[383,2056,2057],{"class":397},"++,",[383,2059,2060],{"class":1604}," 0",[383,2062,980],{"class":407},[383,2064,558],{"class":397},[383,2066,2067],{"class":385,"line":1697},[383,2068,2011],{"class":407},[383,2070,2071],{"class":385,"line":1734},[383,2072,2073],{"class":420},"    \u002F\u002F Optional properties with bitmap\n",[383,2075,2076,2079,2081,2083,2085,2088,2091,2093,2096],{"class":385,"line":1749},[383,2077,2078],{"class":1802},"    if",[383,2080,957],{"class":407},[383,2082,1523],{"class":581},[383,2084,1552],{"class":397},[383,2086,2087],{"class":581},"email",[383,2089,2090],{"class":397}," !==",[383,2092,512],{"class":397},[383,2094,2095],{"class":407},") ",[383,2097,2098],{"class":397},"{\n",[383,2100,2101,2104,2106,2108,2110,2112,2114,2116,2118],{"class":385,"line":1784},[383,2102,2103],{"class":581},"        ser",[383,2105,1552],{"class":397},[383,2107,1993],{"class":1516},[383,2109,1520],{"class":407},[383,2111,1523],{"class":581},[383,2113,1552],{"class":397},[383,2115,2087],{"class":581},[383,2117,980],{"class":407},[383,2119,558],{"class":397},[383,2121,2122,2124,2126,2129,2131,2134,2136,2138,2140],{"class":385,"line":1799},[383,2123,2103],{"class":581},[383,2125,1552],{"class":397},[383,2127,2128],{"class":1516},"setBitMask",[383,2130,1520],{"class":407},[383,2132,2133],{"class":581},"bitmapIndex",[383,2135,867],{"class":397},[383,2137,2060],{"class":1604},[383,2139,980],{"class":407},[383,2141,558],{"class":397},[383,2143,2144],{"class":385,"line":1816},[383,2145,2146],{"class":397},"    }\n",[383,2148,2150,2152,2154,2156,2158,2161,2163,2165,2167],{"class":385,"line":2149},17,[383,2151,2078],{"class":1802},[383,2153,957],{"class":407},[383,2155,1523],{"class":581},[383,2157,1552],{"class":397},[383,2159,2160],{"class":581},"age",[383,2162,2090],{"class":397},[383,2164,512],{"class":397},[383,2166,2095],{"class":407},[383,2168,2098],{"class":397},[383,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204],{"class":385,"line":2171},18,[383,2173,2103],{"class":581},[383,2175,1552],{"class":397},[383,2177,1555],{"class":581},[383,2179,1552],{"class":397},[383,2181,1560],{"class":1516},[383,2183,1520],{"class":407},[383,2185,1949],{"class":581},[383,2187,1552],{"class":397},[383,2189,1570],{"class":581},[383,2191,867],{"class":397},[383,2193,1575],{"class":581},[383,2195,1552],{"class":397},[383,2197,2160],{"class":581},[383,2199,867],{"class":397},[383,2201,1586],{"class":1585},[383,2203,980],{"class":407},[383,2205,558],{"class":397},[383,2207,2209,2211,2213,2215,2217,2219],{"class":385,"line":2208},19,[383,2210,2103],{"class":581},[383,2212,1552],{"class":397},[383,2214,1570],{"class":581},[383,2216,1601],{"class":397},[383,2218,1605],{"class":1604},[383,2220,558],{"class":397},[383,2222,2224,2226,2228,2230,2232,2234,2236,2239,2241],{"class":385,"line":2223},20,[383,2225,2103],{"class":581},[383,2227,1552],{"class":397},[383,2229,2128],{"class":1516},[383,2231,1520],{"class":407},[383,2233,2133],{"class":581},[383,2235,867],{"class":397},[383,2237,2238],{"class":1604}," 1",[383,2240,980],{"class":407},[383,2242,558],{"class":397},[383,2244,2246],{"class":385,"line":2245},21,[383,2247,2146],{"class":397},[383,2249,2251],{"class":385,"line":2250},22,[383,2252,1138],{"class":397},[368,2254,2256],{"id":2255},"union-type-example","Union Type Example",[206,2258,2259],{},"For union types, the compiler generates type-checking code:",[354,2261,2263],{"className":377,"code":2262,"language":379,"meta":362,"style":362},"type Result = string | number | { error: string };\n",[249,2264,2265],{"__ignoreMap":362},[383,2266,2267,2269,2271,2273,2275,2277,2279,2281,2283,2286,2288,2290],{"class":385,"line":386},[383,2268,390],{"class":389},[383,2270,542],{"class":393},[383,2272,398],{"class":397},[383,2274,414],{"class":393},[383,2276,549],{"class":397},[383,2278,432],{"class":393},[383,2280,549],{"class":397},[383,2282,590],{"class":397},[383,2284,2285],{"class":407}," error",[383,2287,411],{"class":397},[383,2289,414],{"class":393},[383,2291,647],{"class":397},[354,2293,2295],{"className":377,"code":2294,"language":379,"meta":362,"style":362},"\u002F\u002F Serialization (simplified)\nfunction serialize(value: Result, ser: SerContext): void {\n    if (typeof value === 'string') {\n        ser.view.setUint8(ser.index++, 0); \u002F\u002F Union index 0\n        ser.serString(value);\n    } else if (typeof value === 'number') {\n        ser.view.setUint8(ser.index++, 1); \u002F\u002F Union index 1\n        ser.view.setFloat64(ser.index, value, true);\n        ser.index += 8;\n    } else if (typeof value === 'object' && value !== null) {\n        ser.view.setUint8(ser.index++, 2); \u002F\u002F Union index 2\n        ser.serString(value.error);\n    } else {\n        throw new Error('Value does not belong to union');\n    }\n}\n",[249,2296,2297,2301,2329,2353,2384,2400,2429,2460,2492,2506,2542,2574,2594,2602,2626,2630],{"__ignoreMap":362},[383,2298,2299],{"class":385,"line":386},[383,2300,1508],{"class":420},[383,2302,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327],{"class":385,"line":404},[383,2304,1513],{"class":389},[383,2306,1517],{"class":1516},[383,2308,1520],{"class":397},[383,2310,1523],{"class":960},[383,2312,411],{"class":397},[383,2314,542],{"class":393},[383,2316,867],{"class":397},[383,2318,1916],{"class":960},[383,2320,411],{"class":397},[383,2322,1537],{"class":393},[383,2324,1540],{"class":397},[383,2326,986],{"class":393},[383,2328,401],{"class":397},[383,2330,2331,2333,2335,2338,2340,2343,2345,2347,2349,2351],{"class":385,"line":424},[383,2332,2078],{"class":1802},[383,2334,957],{"class":407},[383,2336,2337],{"class":397},"typeof",[383,2339,1575],{"class":581},[383,2341,2342],{"class":397}," ===",[383,2344,598],{"class":397},[383,2346,1018],{"class":601},[383,2348,605],{"class":397},[383,2350,2095],{"class":407},[383,2352,2098],{"class":397},[383,2354,2355,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381],{"class":385,"line":440},[383,2356,2103],{"class":581},[383,2358,1552],{"class":397},[383,2360,1555],{"class":581},[383,2362,1552],{"class":397},[383,2364,2046],{"class":1516},[383,2366,1520],{"class":407},[383,2368,1949],{"class":581},[383,2370,1552],{"class":397},[383,2372,1570],{"class":581},[383,2374,2057],{"class":397},[383,2376,2060],{"class":1604},[383,2378,980],{"class":407},[383,2380,417],{"class":397},[383,2382,2383],{"class":420}," \u002F\u002F Union index 0\n",[383,2385,2386,2388,2390,2392,2394,2396,2398],{"class":385,"line":456},[383,2387,2103],{"class":581},[383,2389,1552],{"class":397},[383,2391,1993],{"class":1516},[383,2393,1520],{"class":407},[383,2395,1523],{"class":581},[383,2397,980],{"class":407},[383,2399,558],{"class":397},[383,2401,2402,2405,2408,2411,2413,2415,2417,2419,2421,2423,2425,2427],{"class":385,"line":472},[383,2403,2404],{"class":397},"    }",[383,2406,2407],{"class":1802}," else",[383,2409,2410],{"class":1802}," if",[383,2412,957],{"class":407},[383,2414,2337],{"class":397},[383,2416,1575],{"class":581},[383,2418,2342],{"class":397},[383,2420,598],{"class":397},[383,2422,864],{"class":601},[383,2424,605],{"class":397},[383,2426,2095],{"class":407},[383,2428,2098],{"class":397},[383,2430,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457],{"class":385,"line":488},[383,2432,2103],{"class":581},[383,2434,1552],{"class":397},[383,2436,1555],{"class":581},[383,2438,1552],{"class":397},[383,2440,2046],{"class":1516},[383,2442,1520],{"class":407},[383,2444,1949],{"class":581},[383,2446,1552],{"class":397},[383,2448,1570],{"class":581},[383,2450,2057],{"class":397},[383,2452,2238],{"class":1604},[383,2454,980],{"class":407},[383,2456,417],{"class":397},[383,2458,2459],{"class":420}," \u002F\u002F Union index 1\n",[383,2461,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490],{"class":385,"line":504},[383,2463,2103],{"class":581},[383,2465,1552],{"class":397},[383,2467,1555],{"class":581},[383,2469,1552],{"class":397},[383,2471,1560],{"class":1516},[383,2473,1520],{"class":407},[383,2475,1949],{"class":581},[383,2477,1552],{"class":397},[383,2479,1570],{"class":581},[383,2481,867],{"class":397},[383,2483,1575],{"class":581},[383,2485,867],{"class":397},[383,2487,1586],{"class":1585},[383,2489,980],{"class":407},[383,2491,558],{"class":397},[383,2493,2494,2496,2498,2500,2502,2504],{"class":385,"line":520},[383,2495,2103],{"class":581},[383,2497,1552],{"class":397},[383,2499,1570],{"class":581},[383,2501,1601],{"class":397},[383,2503,1605],{"class":1604},[383,2505,558],{"class":397},[383,2507,2508,2510,2512,2514,2516,2518,2520,2522,2524,2527,2529,2532,2534,2536,2538,2540],{"class":385,"line":1674},[383,2509,2404],{"class":397},[383,2511,2407],{"class":1802},[383,2513,2410],{"class":1802},[383,2515,957],{"class":407},[383,2517,2337],{"class":397},[383,2519,1575],{"class":581},[383,2521,2342],{"class":397},[383,2523,598],{"class":397},[383,2525,2526],{"class":601},"object",[383,2528,605],{"class":397},[383,2530,2531],{"class":397}," &&",[383,2533,1575],{"class":581},[383,2535,2090],{"class":397},[383,2537,496],{"class":397},[383,2539,2095],{"class":407},[383,2541,2098],{"class":397},[383,2543,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2567,2569,2571],{"class":385,"line":1697},[383,2545,2103],{"class":581},[383,2547,1552],{"class":397},[383,2549,1555],{"class":581},[383,2551,1552],{"class":397},[383,2553,2046],{"class":1516},[383,2555,1520],{"class":407},[383,2557,1949],{"class":581},[383,2559,1552],{"class":397},[383,2561,1570],{"class":581},[383,2563,2057],{"class":397},[383,2565,2566],{"class":1604}," 2",[383,2568,980],{"class":407},[383,2570,417],{"class":397},[383,2572,2573],{"class":420}," \u002F\u002F Union index 2\n",[383,2575,2576,2578,2580,2582,2584,2586,2588,2590,2592],{"class":385,"line":1734},[383,2577,2103],{"class":581},[383,2579,1552],{"class":397},[383,2581,1993],{"class":1516},[383,2583,1520],{"class":407},[383,2585,1523],{"class":581},[383,2587,1552],{"class":397},[383,2589,633],{"class":581},[383,2591,980],{"class":407},[383,2593,558],{"class":397},[383,2595,2596,2598,2600],{"class":385,"line":1749},[383,2597,2404],{"class":397},[383,2599,2407],{"class":1802},[383,2601,401],{"class":397},[383,2603,2604,2607,2610,2613,2615,2617,2620,2622,2624],{"class":385,"line":1784},[383,2605,2606],{"class":1802},"        throw",[383,2608,2609],{"class":397}," new",[383,2611,2612],{"class":1516}," Error",[383,2614,1520],{"class":407},[383,2616,605],{"class":397},[383,2618,2619],{"class":601},"Value does not belong to union",[383,2621,605],{"class":397},[383,2623,980],{"class":407},[383,2625,558],{"class":397},[383,2627,2628],{"class":385,"line":1799},[383,2629,2146],{"class":397},[383,2631,2632],{"class":385,"line":1816},[383,2633,1138],{"class":397},[210,2635,2637],{"id":2636},"performance-characteristics","Performance Characteristics",[368,2639,2641],{"id":2640},"payload-size-comparison","Payload Size Comparison",[206,2643,2644],{},"Binary serialization typically produces smaller payloads than JSON:",[218,2646,2647,2663],{},[221,2648,2649],{},[224,2650,2651,2654,2657,2660],{},[227,2652,2653],{},"Data Type",[227,2655,2656],{},"JSON Size",[227,2658,2659],{},"Binary Size",[227,2661,2662],{},"Reduction",[237,2664,2665,2679,2692,2706],{},[224,2666,2667,2670,2673,2676],{},[242,2668,2669],{},"Numbers",[242,2671,2672],{},"Variable (1-20 bytes)",[242,2674,2675],{},"Fixed 8 bytes",[242,2677,2678],{},"~50% for large numbers",[224,2680,2681,2684,2687,2689],{},[242,2682,2683],{},"Booleans",[242,2685,2686],{},"4-5 bytes",[242,2688,1213],{},[242,2690,2691],{},"75-80%",[224,2693,2694,2697,2700,2703],{},[242,2695,2696],{},"Objects",[242,2698,2699],{},"Keys + values + syntax",[242,2701,2702],{},"Values only",[242,2704,2705],{},"30-60%",[224,2707,2708,2711,2714,2717],{},[242,2709,2710],{},"Arrays",[242,2712,2713],{},"Brackets + commas",[242,2715,2716],{},"Length + values",[242,2718,2719],{},"10-30%",[368,2721,2723],{"id":2722},"when-to-use-binary","When to Use Binary",[206,2725,2726],{},"Binary serialization is most effective for:",[1160,2728,2729,2735,2741,2747],{},[340,2730,2731,2734],{},[343,2732,2733],{},"Numeric-heavy data"," - Financial data, sensor readings, coordinates",[340,2736,2737,2740],{},[343,2738,2739],{},"Large arrays"," - Bulk data transfers",[340,2742,2743,2746],{},[343,2744,2745],{},"Bandwidth-constrained environments"," - Mobile apps, IoT devices",[340,2748,2749,2752],{},[343,2750,2751],{},"Real-time applications"," - Gaming, live updates",[206,2754,2755],{},"JSON may be preferable for:",[1160,2757,2758,2764,2770],{},[340,2759,2760,2763],{},[343,2761,2762],{},"Debugging"," - Human-readable format",[340,2765,2766,2769],{},[343,2767,2768],{},"Interoperability"," - Third-party API integration",[340,2771,2772,2775],{},[343,2773,2774],{},"Small payloads"," - Overhead may not justify complexity",[210,2777,2779],{"id":2778},"security-considerations","Security Considerations",[206,2781,2782],{},"The binary serializer includes protections against common attacks:",[1160,2784,2785,2791,2797],{},[340,2786,2787,2790],{},[343,2788,2789],{},"Prototype pollution protection"," - Property names are validated during deserialization",[340,2792,2793,2796],{},[343,2794,2795],{},"Buffer bounds checking"," - Prevents buffer overflow attacks",[340,2798,2799,2802],{},[343,2800,2801],{},"Type validation"," - Values are validated against expected types",[210,2804,2806],{"id":2805},"conclusion","Conclusion",[206,2808,2809],{},"mion's binary serialization provides a powerful, type-safe alternative to JSON for TypeScript applications. By leveraging compile-time type information and JIT compilation, it achieves excellent performance while supporting the full range of TypeScript features that other binary formats cannot handle.",[206,2811,2812],{},"The key advantages are:",[337,2814,2815,2821,2827,2833],{},[340,2816,2817,2820],{},[343,2818,2819],{},"No schema files"," - Your TypeScript types are the schema",[340,2822,2823,2826],{},[343,2824,2825],{},"Full TypeScript support"," - Unions, intersections, generics, and more",[340,2828,2829,2832],{},[343,2830,2831],{},"Optimized encoding"," - Type-aware serialization eliminates redundancy",[340,2834,2835,2838],{},[343,2836,2837],{},"JIT compilation"," - Runtime-generated serializers for maximum performance",[2840,2841,2842],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":362,"searchDepth":404,"depth":404,"links":2844},[2845,2846,2847,2856,2863,2868,2872,2873],{"id":212,"depth":404,"text":213},{"id":331,"depth":404,"text":332},{"id":365,"depth":404,"text":366,"children":2848},[2849,2850,2851,2852,2853,2854,2855],{"id":370,"depth":424,"text":371},{"id":526,"depth":424,"text":527},{"id":669,"depth":424,"text":670},{"id":744,"depth":424,"text":745},{"id":840,"depth":424,"text":841},{"id":991,"depth":424,"text":992},{"id":1060,"depth":424,"text":1061},{"id":1146,"depth":404,"text":1147,"children":2857},[2858,2859,2860,2861,2862],{"id":1150,"depth":424,"text":1151},{"id":1182,"depth":424,"text":1183},{"id":1287,"depth":424,"text":1288},{"id":1405,"depth":424,"text":1406},{"id":1418,"depth":424,"text":1419},{"id":1431,"depth":404,"text":351,"children":2864},[2865,2866,2867],{"id":1457,"depth":424,"text":1458},{"id":1821,"depth":424,"text":1822},{"id":2255,"depth":424,"text":2256},{"id":2636,"depth":404,"text":2637,"children":2869},[2870,2871],{"id":2640,"depth":424,"text":2641},{"id":2722,"depth":424,"text":2723},{"id":2778,"depth":404,"text":2779},{"id":2805,"depth":404,"text":2806},"A comprehensive guide to mion's binary serialization protocol, JIT compilation, and TypeScript feature support.","md",null,{},"\u002Farticles\u002Fbinary-serialization",{"title":197,"description":2874},"9.articles\u002F1.binary-serialization","Naomg55ebiIAaryJla-WdjbvGxz2edRXWZdC6ffuZzI",[2876,2876],1778674530830]