基本上,我希望能够将序列化的类实例(JS前端)发布到端点,并在另一端(nodejs后端)反序列化。 由于我都在使用JS,因此似乎应该可以使用相同的类def进行序列化/反序列化,并在后端使用相同类的实例。
这样,如果class def发生变化,则前端和后端将保持同步。
请有人帮忙一些可能对工作有益的方法/库-或如果以上听起来很疯狂,请告诉我!
答案 0 :(得分:0)
当对象具有toJSON()
方法时,您可以定义需要JSON.stringify()
进行序列化的内容
然后只需设置构造函数和toJSON()
方法就输入/输出兼容即可,您可以来回发送json
class Foo {
constructor(state) {
const defState = {foo: 'bar'}
this.state = state ? Object.assign(defState, state) : defState;
}
get person(){
return this.state.person
}
toJSON() {
return this.state
}
}
// local instance
const localInstance = new Foo({person:'Bob'});
const localJSON = JSON.stringify(localInstance);
console.log('Local class name : ',localInstance.constructor.name)
console.log('LocalJSON', localJSON)
// remote instance from local JSON
const remoteInstance = new Foo(JSON.parse(localJSON))
console.log('Remote instance person : ', remoteInstance.person)
答案 1 :(得分:0)
我制作了一个名为 esserializer 的 npm 模块来解决这个问题:在序列化期间以纯 JSON 格式保存 JavaScript 类实例值及其类名信息。然后可以将序列化的文本发布到端点:
// Browser side
const ESSerializer = require('esserializer');
const serializedText = ESSerializer.serialize(anInstanceOfClassX);
// Send Ajax POST request, with serializedText as data
稍后,在Nodejs服务器的反序列化阶段,esserializer可以递归反序列化对象实例,保留所有类型/函数信息,使用相同的类定义:
// Node.js side
const deserializedObj = ESSerializer.deserialize(serializedText, [ClassX]);
// deserializedObj is a perfect copy of anInstanceOfClassX
如果类定义发生变化,前端和后端将自动同步。