serialism
Version:
Serialize complex JavaScript objects and ESM classes with circular dependencies, natively.
83 lines (74 loc) • 37.3 kB
HTML
<html class="default" lang="en" data-base="./"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>serialism</title><meta name="description" content="Documentation for serialism"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="index.html" class="title">serialism</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h1>serialism</h1></div><div class="tsd-panel tsd-typography"><h1 id="serialism" class="tsd-anchor-link">serialism<a href="#serialism" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h1><p>Serialize complex JavaScript objects and ES classes with circular dependencies natively.</p>
<p><a href="https://www.npmjs.com/package/serialism"><img src="https://img.shields.io/npm/v/serialism.svg" alt="npm"></a>
<a href="https://github.com/voodooattack/serialism/blob/master/LICENSE"><img src="https://img.shields.io/github/license/voodooattack/serialism.svg" alt="GitHub license"></a>
<a href="https://github.com/voodooattack/serialism/issues"><img src="https://img.shields.io/github/issues/voodooattack/serialism.svg" alt="GitHub issues"></a>
<a href="https://travis-ci.org/voodooattack/serialism"><img src="https://travis-ci.org/voodooattack/serialism.svg?branch=master" alt="Build Status"></a> <a href="https://coveralls.io/github/voodooattack/serialism"><img src="https://coveralls.io/repos/github/voodooattack/serialism/badge.svg" alt="Coverage Status"></a>
<img src="https://img.shields.io/npm/types/serialism.svg" alt="npm type definitions"></p>
<h2 id="important-warning" class="tsd-anchor-link">Important Warning<a href="#important-warning" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>The underlying v8 API used by this native addon is still experimental, and binary compatibility may not be guaranteed between data output by the same application running in two different node versions.</p>
<p>If you plan to use this over a wire, please bear that in mind.</p>
<h2 id="compatibility" class="tsd-anchor-link">Compatibility<a href="#compatibility" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><ul>
<li>node.js >= v20.19.3 (LTS/Jod)</li>
</ul>
<h2 id="installation" class="tsd-anchor-link">Installation<a href="#installation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><h3 id="prerequisites" class="tsd-anchor-link">Prerequisites<a href="#prerequisites" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Please make sure you have the following installed:</p>
<ul>
<li>Python</li>
<li>Make</li>
<li>C++ compiler</li>
</ul>
<p>Use one of the following commands depending on your platform.</p>
<h4 id="linux" class="tsd-anchor-link">Linux<a href="#linux" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>You need <code>g++</code>, <code>make</code> and <code>python</code> installed.</p>
<h5 id="ubuntudebian" class="tsd-anchor-link">Ubuntu/Debian<a href="#ubuntudebian" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h5><p><code>sudo apt-get install -y build-essential python</code></p>
<h5 id="fedora" class="tsd-anchor-link">Fedora<a href="#fedora" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h5><p><code>dnf install gcc-c++ make</code></p>
<h5 id="rhel-and-centos" class="tsd-anchor-link">RHEL and CentOS<a href="#rhel-and-centos" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h5><p><code>yum install -y gcc-c++ make</code></p>
<h4 id="windows" class="tsd-anchor-link">Windows<a href="#windows" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p><code>npm install -g --production windows-build-tools</code></p>
<h2 id="usage" class="tsd-anchor-link">Usage<a href="#usage" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p>Use <code>npm install serialism</code> to install the npm package.</p>
<h3 id="simple-example" class="tsd-anchor-link">Simple Example<a href="#simple-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">buffer</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">().</span><span class="hl-3">serialize</span><span class="hl-1">([</span><span class="hl-4">1</span><span class="hl-1">,</span><span class="hl-4">2</span><span class="hl-1">,</span><span class="hl-4">3</span><span class="hl-1">])</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">deserialized</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">().</span><span class="hl-3">deserialize</span><span class="hl-1">(</span><span class="hl-5">buffer</span><span class="hl-1">); </span><br/><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-3">log</span><span class="hl-1">(</span><span class="hl-5">deserialized</span><span class="hl-1">) </span><span class="hl-6">// [1, 2, 3]</span>
</code><button type="button">Copy</button></pre>
<h4 id="so-why-would-i-use-this-over-jsonstringify" class="tsd-anchor-link">So, why would I use this over <code>JSON.stringify</code>?<a href="#so-why-would-i-use-this-over-jsonstringify" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The biggest difference about serialism-aside from extended type support—is that it preserves an object's graph, i.e if you do this:</p>
<pre><code class="js"><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">array</span><span class="hl-1"> = [</span><span class="hl-4">1</span><span class="hl-1">, </span><span class="hl-4">2</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">]</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">buffer</span><span class="hl-1"> = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">serialize</span><span class="hl-1">({</span><span class="hl-5">arr1:</span><span class="hl-1"> </span><span class="hl-5">array</span><span class="hl-1">, </span><span class="hl-5">arr2:</span><span class="hl-1"> </span><span class="hl-5">array</span><span class="hl-1">})</span>
</code><button type="button">Copy</button></pre>
<p>If you save the buffer and deserialize it later on, then—unlike <code>JSON</code>—the following holds true:</p>
<pre><code class="js"><span class="hl-0">const</span><span class="hl-1"> {</span><span class="hl-2">arr1</span><span class="hl-1">, </span><span class="hl-2">arr2</span><span class="hl-1">} = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">deserialize</span><span class="hl-1">(</span><span class="hl-5">buffer</span><span class="hl-1">)</span><br/><span class="hl-6">// Check for strict equality</span><br/><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-3">log</span><span class="hl-1">(</span><span class="hl-5">arr1</span><span class="hl-1"> === </span><span class="hl-5">arr2</span><span class="hl-1">); </span><span class="hl-6">// true</span>
</code><button type="button">Copy</button></pre>
<p>Another tangential benefit is compactness. Serialism returns a node <code>Buffer</code> object, containing the object graph in a compact binary format.</p>
<p>Duplicate objects (i.e objects that exhibit strict equality) are stored using references, so no single value is ever stored twice.</p>
<p>The binary format is also useful if you wish to send it to a Worker or over an IPC mechanism while preserving its structure.</p>
<h3 id="more-complex-example" class="tsd-anchor-link">More Complex Example<a href="#more-complex-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">assert</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'chai'</span><span class="hl-1">;</span><br/><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Serialism</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'serialism'</span><span class="hl-1">;</span><br/><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Class1</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'./Class1'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">serialism</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">();</span><br/><br/><span class="hl-6">// Register a class.</span><br/><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">register</span><span class="hl-1">(</span><span class="hl-5">Class1</span><span class="hl-1">);</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">sharedArray</span><span class="hl-1"> = [</span><span class="hl-8">'value'</span><span class="hl-1">];</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">target</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-5">undef:</span><span class="hl-1"> </span><span class="hl-0">undefined</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">nullVal:</span><span class="hl-1"> </span><span class="hl-0">null</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">negativeZero:</span><span class="hl-1"> -</span><span class="hl-4">0</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">test:</span><span class="hl-1"> </span><span class="hl-8">'hello world'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">array:</span><span class="hl-1"> [</span><span class="hl-4">1</span><span class="hl-1">, </span><span class="hl-4">2</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">, </span><span class="hl-8">'test'</span><span class="hl-1">, </span><span class="hl-5">Math</span><span class="hl-1">.</span><span class="hl-2">PI</span><span class="hl-1">, </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Date</span><span class="hl-1">()],</span><br/><span class="hl-1"> </span><span class="hl-5">buffer:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Uint8Array</span><span class="hl-1">([</span><span class="hl-4">1</span><span class="hl-1">, </span><span class="hl-4">2</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">]),</span><br/><span class="hl-1"> </span><span class="hl-5">arrayBuffer:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">ArrayBuffer</span><span class="hl-1">(</span><span class="hl-4">8</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-5">arrayBufferView:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Uint8Array</span><span class="hl-1">([</span><span class="hl-4">1</span><span class="hl-1">, </span><span class="hl-4">2</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">]),</span><br/><span class="hl-1"> </span><span class="hl-5">map:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Map</span><span class="hl-1"><</span><span class="hl-9">any</span><span class="hl-1">, </span><span class="hl-9">any</span><span class="hl-1">>([[</span><span class="hl-8">'hi'</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">], [</span><span class="hl-0">Infinity</span><span class="hl-1">, </span><span class="hl-8">'test'</span><span class="hl-1">], [</span><span class="hl-0">NaN</span><span class="hl-1">, </span><span class="hl-0">null</span><span class="hl-1">]]),</span><br/><span class="hl-1"> </span><span class="hl-5">set:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Set</span><span class="hl-1"><</span><span class="hl-9">any</span><span class="hl-1">>([</span><span class="hl-4">1</span><span class="hl-1">, </span><span class="hl-4">2</span><span class="hl-1">, </span><span class="hl-4">3</span><span class="hl-1">, +</span><span class="hl-4">0</span><span class="hl-1">, </span><span class="hl-0">null</span><span class="hl-1">, </span><span class="hl-0">undefined</span><span class="hl-1">]),</span><br/><span class="hl-1"> </span><span class="hl-5">regexp:</span><span class="hl-10"> /hello-world/</span><span class="hl-0">g</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">instance:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Class1</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-5">str:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">String</span><span class="hl-1">(</span><span class="hl-8">'string object instance'</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-5">num:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Number</span><span class="hl-1">(</span><span class="hl-4">100</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-5">object:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-8">'test long key'</span><span class="hl-5">:</span><span class="hl-1"> </span><span class="hl-8">'value'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">emptyString:</span><span class="hl-1"> </span><span class="hl-8">''</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">sharedArray</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">sharedArray</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">myClass:</span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Class1</span><span class="hl-1">()</span><br/><span class="hl-1">};</span><br/><br/><span class="hl-6">// create some basic and deeply nested cyclic dependencies</span><br/><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1"> = </span><span class="hl-5">target</span><span class="hl-1">;</span><br/><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">map</span><span class="hl-1">.</span><span class="hl-3">set</span><span class="hl-1">(</span><span class="hl-5">target</span><span class="hl-1">, </span><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">set</span><span class="hl-1">);</span><br/><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">set</span><span class="hl-1">.</span><span class="hl-3">add</span><span class="hl-1">(</span><span class="hl-5">target</span><span class="hl-1">);</span><br/><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">map</span><span class="hl-1">.</span><span class="hl-3">set</span><span class="hl-1">(</span><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">array</span><span class="hl-1">, </span><span class="hl-5">target</span><span class="hl-1">.</span><span class="hl-5">instance</span><span class="hl-1">);</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">data</span><span class="hl-1"> = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">serialize</span><span class="hl-1">(</span><span class="hl-5">target</span><span class="hl-1">);</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">result</span><span class="hl-1"> = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">deserialize</span><span class="hl-1"><</span><span class="hl-0">typeof</span><span class="hl-1"> </span><span class="hl-5">target</span><span class="hl-1">>(</span><span class="hl-5">result</span><span class="hl-1">);</span><br/><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">deepEqual</span><span class="hl-1">(</span><span class="hl-5">target</span><span class="hl-1">, </span><span class="hl-5">result</span><span class="hl-1">); </span><span class="hl-6">// true</span><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">strictEquals</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1">, </span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">map</span><span class="hl-1">.</span><span class="hl-3">get</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1">)) </span><span class="hl-6">// true</span><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">strictEquals</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1">, </span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">map</span><span class="hl-1">.</span><span class="hl-3">get</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1">)) </span><span class="hl-6">// true</span><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">strictEquals</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">cyclic</span><span class="hl-1">, </span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">map</span><span class="hl-1">.</span><span class="hl-3">get</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">array</span><span class="hl-1">)) </span><span class="hl-6">// true</span><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">strictEquals</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">sharedArray</span><span class="hl-1">, </span><span class="hl-5">result</span><span class="hl-1">.</span><span class="hl-5">object</span><span class="hl-1">.</span><span class="hl-5">sharedArray</span><span class="hl-1">) </span><span class="hl-6">// true</span>
</code><button type="button">Copy</button></pre>
<h4 id="javascript" class="tsd-anchor-link">JavaScript<a href="#javascript" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="js"><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">Serialism</span><span class="hl-1"> = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-8">'serialism'</span><span class="hl-1">).</span><span class="hl-5">Serialism</span><span class="hl-1">;</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">Class1</span><span class="hl-1"> = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-8">'./Class1'</span><span class="hl-1">);</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">serialism</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">().</span><span class="hl-3">register</span><span class="hl-1">(</span><span class="hl-5">Class1</span><span class="hl-1">);</span><br/><br/><span class="hl-6">// serialize an object, an array, a regex, a set, a map, a primitive value, anything works except local symbols</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">data</span><span class="hl-1"> = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">serialize</span><span class="hl-1">([</span><br/><span class="hl-1"> </span><span class="hl-4">1</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-4">2</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">NaN</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Map</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Set</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-10">/my-regex-here/</span><span class="hl-0">g</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Class1</span><span class="hl-1">()</span><br/><span class="hl-1">]);</span><br/><br/><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-3">log</span><span class="hl-1">(</span><span class="hl-5">Buffer</span><span class="hl-1">.</span><span class="hl-3">isBuffer</span><span class="hl-1">(</span><span class="hl-5">data</span><span class="hl-1">)); </span><span class="hl-6">// true;</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">deserialized</span><span class="hl-1"> = </span><span class="hl-5">serialism</span><span class="hl-1">.</span><span class="hl-3">deserialize</span><span class="hl-1">(</span><span class="hl-5">data</span><span class="hl-1">); </span><span class="hl-6">// deserialize the data</span><br/><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">deepEqual</span><span class="hl-1">(</span><span class="hl-5">data</span><span class="hl-1">, </span><span class="hl-5">deserialized</span><span class="hl-1">); </span><span class="hl-6">// true</span>
</code><button type="button">Copy</button></pre>
<h3 id="error-handling" class="tsd-anchor-link">Error Handling<a href="#error-handling" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><ul>
<li>All classes must be registered to be proccessed. Serialism will throw if you attempt to serialize an unknown class.</li>
</ul>
<pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">assert</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'chai'</span><span class="hl-1">;</span><br/><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">Serialism</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'serialism'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">serializer</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">();</span><br/><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">throws</span><span class="hl-1">(() </span><span class="hl-0">=></span><span class="hl-1"> </span><span class="hl-5">serializer</span><span class="hl-1">.</span><span class="hl-3">serialize</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-0">class</span><span class="hl-1"> </span><span class="hl-9">MyUnregisteredClass</span><span class="hl-1"> {}</span><br/><span class="hl-1"> ), </span><br/><span class="hl-1"> </span><span class="hl-8">"No registered class found for MyUnregisteredClass"</span><br/><span class="hl-1">);</span><br/>
</code><button type="button">Copy</button></pre>
<ul>
<li>Serialism will throw if you attempt to deserialize an unknown class.</li>
</ul>
<pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">assert</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'chai'</span><span class="hl-1">;</span><br/><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">Serialism</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'serialism'</span><span class="hl-1">;</span><br/><br/><span class="hl-0">class</span><span class="hl-1"> </span><span class="hl-9">RegisteredClass</span><span class="hl-1"> {}</span><br/><br/><span class="hl-5">serializer</span><span class="hl-1">.</span><span class="hl-3">register</span><span class="hl-1">(</span><span class="hl-5">RegisteredClass</span><span class="hl-1">);</span><br/><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">result</span><span class="hl-1"> = </span><span class="hl-5">serializer</span><span class="hl-1">.</span><span class="hl-3">serialize</span><span class="hl-1">(</span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">RegisteredClass</span><span class="hl-1">());</span><br/><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">throws</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-6">// A new deserializer instance does not know the class.</span><br/><span class="hl-1"> () </span><span class="hl-0">=></span><span class="hl-1"> </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">().</span><span class="hl-3">deserialize</span><span class="hl-1">(</span><span class="hl-5">result</span><span class="hl-1">), </span><br/><span class="hl-1"> </span><span class="hl-8">"No registered class found for: RegisteredClass"</span><br/><span class="hl-1">);</span>
</code><button type="button">Copy</button></pre>
<h5 id="registering-classes" class="tsd-anchor-link">Registering Classes<a href="#registering-classes" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h5><ul>
<li>You can't register two different classes with the same name.</li>
</ul>
<pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">assert</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'chai'</span><span class="hl-1">;</span><br/><span class="hl-7">import</span><span class="hl-1"> {</span><span class="hl-5">Serialism</span><span class="hl-1">} </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-8">'serialism'</span><span class="hl-1">;</span><br/><br/><span class="hl-5">assert</span><span class="hl-1">.</span><span class="hl-3">throws</span><span class="hl-1">(() </span><span class="hl-0">=></span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">serializer2</span><span class="hl-1"> = </span><span class="hl-0">new</span><span class="hl-1"> </span><span class="hl-3">Serialism</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-5">serializer2</span><span class="hl-1">.</span><span class="hl-3">register</span><span class="hl-1">(</span><span class="hl-0">class</span><span class="hl-1"> </span><span class="hl-9">RegisteredClass</span><span class="hl-1"> {});</span><br/><span class="hl-1"> </span><span class="hl-5">serializer2</span><span class="hl-1">.</span><span class="hl-3">register</span><span class="hl-1">(</span><span class="hl-0">class</span><span class="hl-1"> </span><span class="hl-9">RegisteredClass</span><span class="hl-1"> {});</span><br/><span class="hl-1">}, </span><span class="hl-8">"A different class with the name 'RegisteredClass' is already registered."</span><span class="hl-1">);</span>
</code><button type="button">Copy</button></pre>
<h3 id="contributions" class="tsd-anchor-link">Contributions<a href="#contributions" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>All contributions and pull requests are welcome.</p>
<p>If you have something to suggest or an idea you'd like to discuss, then please submit an issue or a pull request.</p>
<p>Note: Please commit your changes using <code>npm run commit</code> to trigger <code>conventional-changelog</code>.</p>
<h3 id="license-mit" class="tsd-anchor-link">License (MIT)<a href="#license-mit" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Copyright (c) 2018 Abdullah A. Hassan</p>
<p>Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:</p>
<p>The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.</p>
<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.</p>
</div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#serialism"><span>serialism</span></a><ul><li><a href="#important-warning"><span>Important <wbr/>Warning</span></a></li><li><a href="#compatibility"><span>Compatibility</span></a></li><li><a href="#installation"><span>Installation</span></a></li><li><ul><li><a href="#prerequisites"><span>Prerequisites</span></a></li><li><ul><li><a href="#linux"><span>Linux</span></a></li><li><ul><li><a href="#ubuntudebian"><span>Ubuntu/<wbr/>Debian</span></a></li><li><a href="#fedora"><span>Fedora</span></a></li><li><a href="#rhel-and-centos"><span>RHEL and <wbr/>Cent<wbr/>OS</span></a></li></ul></li><li><a href="#windows"><span>Windows</span></a></li></ul></li></ul></li><li><a href="#usage"><span>Usage</span></a></li><li><ul><li><a href="#simple-example"><span>Simple <wbr/>Example</span></a></li><li><ul><li><a href="#so-why-would-i-use-this-over-jsonstringify"><span>So, why would <wbr/>I use this over <wbr/>JSON.stringify?</span></a></li></ul></li><li><a href="#more-complex-example"><span>More <wbr/>Complex <wbr/>Example</span></a></li><li><ul><li><a href="#javascript"><span>Java<wbr/>Script</span></a></li></ul></li><li><a href="#error-handling"><span>Error <wbr/>Handling</span></a></li><li><ul><li><ul><li><a href="#registering-classes"><span>Registering <wbr/>Classes</span></a></li></ul></li></ul></li><li><a href="#contributions"><span>Contributions</span></a></li><li><a href="#license-mit"><span>License (<wbr/>MIT)</span></a></li></ul></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">serialism</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>