Serialize/Deserialize objects maintaining references (circular refs too)
npm install picklify
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]);
*/
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
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);
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]
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
see test.js