Skip to content

lwoites/picklify

Repository files navigation

Build Status codecov Greenkeeper badge

Serialize/Deserialize objects maintaining references (circular refs too)

Install

npm install picklify

Basic Usage

You can serialize an object using the picklify.picklify function. The only requirement for your custom objects is to have an empty constructor (or make your constructor does not crash when calling it with no arguments).

const { picklify, unpicklify } = require('picklify');
let serializedData = picklify(someObject);
// serializedData is JSON object that can be saved or being sent through the network

let originalObject = unpicklify(serializedData);

/* unpicklify need access to constructors for building the original objects.
** So they must be on the global scope or being passed as a second argument to unpicklify

let originalObject = unpicklify(serializedData, [class1, class2]);
*/

Examples

Keep references

const aSharedList = [4, 5, 6];
const object1 = {'a': 1, 'l1': aSharedList};
const object2 = {'b': 2, 'l2': aSharedList};
const input = [object1, object2, object1, object2];

const serializedData = picklify.picklify(input);
const reconstructedObject = picklify.unpicklify(serializedData);

reconstructedObject[0].l1 ==  reconstructedObject[1].l2 // true
reconstructedObject[0] == reconstructedObject[2]; // true
reconstructedObject[1] == reconstructedObject[3]; // true

Allow recursion

let object1 = {'a': 1};
const object2 = {'b': 2, 'o1': object1}; //object2 references object1
object1['o2'] = object2; //object1 references object2


const serializedData = picklify.picklify(object1);
const reconstructedObject = picklify.unpicklify(serializedData);

Custom classes

class Musician {
    constructor(name, age) {
        this.name = name
        this.age = age
    }
}

class Band {
    constructor(name, members) {
        this.name = name
        this.members = members
    }
}

let slash = new Musician('Slash', 44);
let gnr = new Band('GnR', [slash]);
let velvetRevolver = new Band('Velvet Revolver', [slash]);

const bands = [gnr, velvetRevolver];
const serializedData = picklify.picklify(bands);

const reconstructedBands = picklify.unpicklify(
    serializedData, [Band, Musician]
);

// evaulates to true
reconstructedBands[0].members[0] == reconstructedBands[1].members[0]

Only Serialize specific attributes on objects

class Musician {

    constructor(name, age, instrument) {
        this.name = name
        this.age = age
        this.instrument = instrument
    }

    propsToSerialize() {
        return ["name",]
    }
}


const slash = new Musician('Slash', 44, "Guitar");
const serializedData = picklify.picklify(slash);

const reconstructedSlash = picklify.unpicklify(
    serializedData, [Musician]
);

// evaulates to true
reconstructedSlash.age === undefined
reconstructedSlash.instrument === undefined

Reference

see test.js

About

No description or website provided.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 5